|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
19.07.2012, 12:38 | #1 |
Пользователь
Регистрация: 14.12.2010
Сообщений: 20
|
Блокирование файла
Приветствую, знатоки!
У меня такой вопрос: есть два процесса (аналогичные) по записи в файл данных (типа int). Для того чтобы они не мешали друг другу я блокирую файл при работе одного из процессов. Однако, если файл уже существует, то все проходит нормально и сперва записывает один процесс, потом другой. Если файл не существует а при CreateProcess у меня стоит OPEN_ALWAYS, то блокировка не срабатывает и они записывают одновременно. Подскажите, пожалуйста, в чем причина. Вот коды процессов: #include<windows.h> #include<iostream.h> int main(){ DWORD dwCount; HANDLE hFile; DWORD dwFileSize; hFile=CreateFile("C:\\Documents and Settings\\bberdybekov\\Private\\C++ \\MyProjects\\FileBlock1\\Debug\\Fi leBlock.dat", GENERIC_WRITE,FILE_SHARE_WRITE,NULL ,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL); if(hFile==INVALID_HANDLE_VALUE){ cerr<<"Create file failed."<<endl <<"The last error code: "<<GetLastError()<<endl; cout<<"Press any key to finish."; cin.get(); return 0; } dwFileSize=GetFileSize(hFile,NULL); if(dwFileSize==-1){ cerr<<"Get file size failed."<<endl <<"The last error code: "<<GetLastError()<<endl; CloseHandle(hFile); cout<<"Press any key to finish."; cin.get(); return 0; } /*if(!LockFile(hFile,0,0,dwFileSize, 0)){ cerr<<"Lock file failed." <<"The last error code: "<<GetLastError()<<endl; CloseHandle(hFile); cout<<"Press any key to finish."<<endl; cin.get(); return 0; }*/ while(!LockFile(hFile,0,0,dwFileSiz e,0)); cout<<"Now the file is locked."<<endl <<"Press any key to continue."<<endl; //cin.get(); //SetFilePointer(hFile,0,NULL,FILE_EN D); for(int i=0;i<10;i++){ cout<<i<<endl; SetFilePointer(hFile,0,NULL,FILE_EN D); WriteFile(hFile,&i,sizeof(i),&dwCou nt,NULL); Sleep(1000); } if(!UnlockFile(hFile,0,0,dwFileSize ,0)){ cerr<<"Unlock file failed."<<endl <<"The last error code: "<<GetLastError()<<endl; CloseHandle(hFile); cout<<"Press any key to finish."; cin.get(); return 0; } cout<<"Now the file is unlocked."<<endl <<"Press any key to continue."<<endl; cin.get(); CloseHandle(hFile); return 0; } Второй аналогичный. Запускаются одновременно |
19.07.2012, 13:12 | #2 |
Пользователь
Регистрация: 15.12.2010
Сообщений: 78
|
заключи код в тэг [\CODE], читать невозможно
|
19.07.2012, 13:44 | #3 | |
Форумчанин
Регистрация: 08.07.2010
Сообщений: 505
|
Цитата:
Знающий не говорит, говорящий не знает (С) Лао Цзы
Последний раз редактировалось Krok27; 19.07.2012 в 13:57. |
|
19.07.2012, 16:05 | #4 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
CREATE_NEW создаст файл только если его нет, иначе будет INVALID_HANDLE.
Если пользуемся Windows зачем отравлять себе так жизнь? Для етих целей есть CreateMutex() / WaitForSingleObject |
20.07.2012, 13:23 | #5 |
Пользователь
Регистрация: 14.12.2010
Сообщений: 20
|
С мьютексами я проработал код и проблем на одном компе нет. Но у меня процессы на разных компьютерах в сети. А мьютекс сработает если процессоры на разных компьютерах?
|
20.07.2012, 13:25 | #6 |
Пользователь
Регистрация: 14.12.2010
Сообщений: 20
|
Цитата:
Запускаются одновременно Это обязательное условие? Да это обязательное условие ) |
20.07.2012, 13:25 | #7 |
Пользователь
Регистрация: 14.12.2010
Сообщений: 20
|
да это обязательное условие
|
20.07.2012, 13:27 | #8 |
Пользователь
Регистрация: 14.12.2010
Сообщений: 20
|
|
20.07.2012, 13:59 | #9 | |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
Цитата:
а) Открывам файл с FILE_SHARE_READ, после чего второй процес должен получить access denied ошибку и будет циклить пока не дорвется до файла. Хотя хрен знает по сети какая ошибка вылезет. б) Открываем/Закрываем/Открываем файл. Таким образом файл *всегда* будет существовать ну а в этом случае как мы поняли все работает. |
|
20.07.2012, 14:18 | #10 | |
Пользователь
Регистрация: 14.12.2010
Сообщений: 20
|
Цитата:
Последний раз редактировалось Balabek; 20.07.2012 в 14:25. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Блокирование портов | DeDoK | Работа с сетью в Delphi | 3 | 25.01.2011 19:54 |
блокирование доступа | Che Guevara | PHP | 2 | 18.10.2010 16:24 |
блокирование клавиатуры | transserg | Win Api | 6 | 01.04.2010 11:06 |
Блокирование ALT+F4 | Killbrum | Win Api | 5 | 14.03.2009 12:23 |
блокирование функции | Fireleo | Win Api | 5 | 29.07.2007 17:04 |