![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удалить первые n-байт из файла [D7, WinXP]
Dmitry_177 © (2006-11-03 12:49:00)Я работаю с файлом посредством API функций, это CreateFile, ReadFile и WriteFile. Понадобилось удалять часть файла, т.е. байты которые находятся в начале файла... Я видел в интернете что для этого можно сделать так: установить указатель в нужное место SetFilePointer, затем считать в буфер нужное колличество байт ReadFile, потом выполняется функция SetEndOfFile и наконец идет запись из буфера WriteFile... Но этот способ мне не подходит, т.к. в этот же файл постоянно происходит запись в другой программе, и мне кажется что во время всех этих действий(копирования, очистки, вставления) могут не все байты записаться... Что вы посоветуете в такой ситуации?
Dmitry_177 (2006-11-03 21:05:00) [1]Забыл сказать, это две мои программы. Вроде как решил проблему, сделал я так: как только понадобилось вырезать первые байты из файла, в программе которая записывает происходят такие действия:
var
hFile: THandle;
WaintFileStr: string = ''; // временный буфер для записи
WaintFileBool: bool = false; // при false записывает в файл, а при true в WaintFileStr
...
FlushFileBuffers(hFile);
WaintFileBool := true;
...
В ней же при записи:
if not WaintFileBool then
WriteFile(hFile, ...)
else
WaintFileStr := WaintFileStr + ...;
А в это время вырезается кусок из файла в другой программе..
А потом после того как вырезался кусок, в программе которая записывает:
SetFilePointer(hFile, 0, nil, FILE_BEGIN);
SetEndOfFile(hFile);
WriteFile(hFile, WaintFileStr...);
WaintFileBool := false;
WaintFileStr := '';
Т.е. на тот момент в который происходит вырезание куска из файла, программа которая записывает в файл записывает в буфер, а потом его записывает в файл...
Anatoly Podgoretsky (2006-11-03 14:05:00) [2]> Dmitry_177 (03.11.2006 13:51:04) [4]
> потом после всего этого где окажется указаль в файле в той программе
> которая производит запись?
Где был там и откажется, но это проблема другой программы, незачем держать
открытый файл, в многопользовательской системе.
Reindeer Moss Eater (2006-11-03 13:58:00) [3]После разблокировки файл может быть открыт другими программами.
Где будет указатель после открытия файла?
В начале файла наверное.
Dmitry_177 (2006-11-03 13:56:00) [4]Reindeer Moss Eater, после разблокировки уже...
Reindeer Moss Eater (2006-11-03 13:52:00) [5]то потом после всего этого где окажется указаль в файле в той программе которая производит запись?
Нигде.
Так как не будет программы производящей запись.
Dmitry_177 (2006-11-03 13:51:00) [6]Я уже думал об этом...Но у меня возникло 2 вопроса по этому поводу:
1: Если заблокировать файл, и провести все те действия, то потом после всего этого где окажется указаль в файле в той программе которая производит запись? Например был там указатель в конце файла, но потом файл стал короче, где окажется указатель? в конце? т.е. переместится в "новый" конец файла?
2: Чтобы заблокировать файл, какой нужно ставить режим совместного доступа(3-й параметр CreateFile)? FILE_SHARE_READ or FILE_SHARE_WRITE так?
Reindeer Moss Eater (2006-11-03 13:45:00) [7]открывай файл монопольно и делай как видел в интернете.
только при этом другие программы обломаются с записью.
Dmitry_177 (2006-11-03 13:40:00) [8]
> Зачем?
Я не знаю как ответить на этот вопрос, потребовалось вдруг...)))
Anatoly Podgoretsky (2006-11-03 13:15:00) [9]> Dmitry_177 (03.11.2006 12:49:00) [0]
> kudatsky (03.11.2006 12:46:00) [0]
Зачем?