Текущий архив: 2006.12.17;
Скачать: CL | DM;
ВнизУдалить первые n-байт из файла Найти похожие ветки
← →
Dmitry_177 (2006-11-03 12:49) [0]Я работаю с файлом посредством API функций, это CreateFile, ReadFile и WriteFile. Понадобилось удалять часть файла, т.е. байты которые находятся в начале файла... Я видел в интернете что для этого можно сделать так: установить указатель в нужное место SetFilePointer, затем считать в буфер нужное колличество байт ReadFile, потом выполняется функция SetEndOfFile и наконец идет запись из буфера WriteFile... Но этот способ мне не подходит, т.к. в этот же файл постоянно происходит запись в другой программе, и мне кажется что во время всех этих действий(копирования, очистки, вставления) могут не все байты записаться... Что вы посоветуете в такой ситуации?
← →
Anatoly Podgoretsky © (2006-11-03 13:15) [1]> Dmitry_177 (03.11.2006 12:49:00) [0]
> kudatsky (03.11.2006 12:46:00) [0]
Зачем?
← →
Dmitry_177 (2006-11-03 13:40) [2]
> Зачем?
Я не знаю как ответить на этот вопрос, потребовалось вдруг...)))
← →
Reindeer Moss Eater © (2006-11-03 13:45) [3]открывай файл монопольно и делай как видел в интернете.
только при этом другие программы обломаются с записью.
← →
Dmitry_177 (2006-11-03 13:51) [4]Я уже думал об этом...Но у меня возникло 2 вопроса по этому поводу:
1: Если заблокировать файл, и провести все те действия, то потом после всего этого где окажется указаль в файле в той программе которая производит запись? Например был там указатель в конце файла, но потом файл стал короче, где окажется указатель? в конце? т.е. переместится в "новый" конец файла?
2: Чтобы заблокировать файл, какой нужно ставить режим совместного доступа(3-й параметр CreateFile)? FILE_SHARE_READ or FILE_SHARE_WRITE так?
← →
Reindeer Moss Eater © (2006-11-03 13:52) [5]то потом после всего этого где окажется указаль в файле в той программе которая производит запись?
Нигде.
Так как не будет программы производящей запись.
← →
Dmitry_177 (2006-11-03 13:56) [6]Reindeer Moss Eater, после разблокировки уже...
← →
Reindeer Moss Eater © (2006-11-03 13:58) [7]После разблокировки файл может быть открыт другими программами.
Где будет указатель после открытия файла?
В начале файла наверное.
← →
Anatoly Podgoretsky © (2006-11-03 14:05) [8]> Dmitry_177 (03.11.2006 13:51:04) [4]
> потом после всего этого где окажется указаль в файле в той программе
> которая производит запись?
Где был там и откажется, но это проблема другой программы, незачем держать
открытый файл, в многопользовательской системе.
← →
Dmitry_177 (2006-11-03 21:05) [9]Забыл сказать, это две мои программы. Вроде как решил проблему, сделал я так: как только понадобилось вырезать первые байты из файла, в программе которая записывает происходят такие действия:
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 := "";
Т.е. на тот момент в который происходит вырезание куска из файла, программа которая записывает в файл записывает в буфер, а потом его записывает в файл...
Страницы: 1 вся ветка
Текущий архив: 2006.12.17;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.047 c