Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Удалить первые n-байт из файла


Автор: Dmitry_177 3.11.2006, 12:49
Я работаю с файлом посредством API функций, это CreateFile, ReadFile и WriteFile. Понадобилось удалять часть файла, т.е. байты которые находятся в начале файла... Я видел в интернете что для этого можно сделать так: установить указатель в нужное место SetFilePointer, затем считать в буфер нужное колличество байт ReadFile, потом выполняется функция SetEndOfFile и наконец идет запись из буфера WriteFile... Но этот способ мне не подходит, т.к. в этот же файл постоянно происходит запись в другой программе, и мне кажется что во время всех этих действий(копирования, очистки, вставления) могут не все байты записаться... Что вы посоветуете в такой ситуации?

Автор: Zero 3.11.2006, 13:00
Цитата(Dmitry_177 @  3.11.2006,  13:49 Найти цитируемый пост)
Но этот способ мне не подходит, т.к. в этот же файл постоянно происходит запись в другой программе

Постоянно это как, другое приложение его всегда держит открытым??? Если так, то его редактировать удалять и т.п. не получится...

Автор: _hunter 3.11.2006, 13:04
в таком случае открывай файл эксклюзивно (sharing)

Автор: Dmitry_177 3.11.2006, 13:15
То приложение которое производит запись, да, оно постоянно держит файл открытым и у него режим совместного доступа(3-й параметр CreateFile) FILE_SHARE_READ or FILE_SHARE_WRITE.

Автор: Snowy 3.11.2006, 13:21
Ну тогда никак.

Автор: Dmitry_177 3.11.2006, 13:53
А если блокировать файл?... Но у меня возникло 2 вопроса по этому поводу:

1: Если заблокировать файл, и провести все те действия, то потом после всего этого где окажется указаль в файле в той программе которая производит запись? Например был там указатель в конце файла, но потом файл стал короче, где окажется указатель? в конце? т.е. переместится в "новый" конец файла?

2: Чтобы заблокировать файл, какой нужно ставить режим совместного доступа(3-й параметр CreateFile)? FILE_SHARE_READ or FILE_SHARE_WRITE так?



Может можно какнибудь при помощи мьютекса?

Автор: Alexeis 3.11.2006, 18:16
Цитата(Dmitry_177 @  3.11.2006,  13:53 Найти цитируемый пост)

Может можно какнибудь при помощи мьютекса? 

Можно если обе программы свои.

Автор: Dmitry_177 3.11.2006, 19:01
Мои ))) о обоих открываю как FILE_SHARE_READ or FILE_SHARE_WRITE

Добавлено @ 19:12 
вроде как решил проблему, сделал я так: как только понадобилось вырезать первые байты из файла, в программе которая записывает происходят такие действия:
Код

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 := '';


Т.е. на тот момент в который происходит вырезание куска из файла, программа которая записывает в файл записывает в буфер, а потом его записывает в файл...

Автор: dumb 4.11.2006, 04:24
сдается, что неверно выбрано решение в целом.

Автор: Dmitry_177 4.11.2006, 13:49
Вроде работает )))

Автор: Zero 4.11.2006, 18:22
Цитата(Dmitry_177 @  4.11.2006,  14:49 Найти цитируемый пост)
Вроде работает ))) 

Как всётаки сделал???

Автор: Dmitry_177 4.11.2006, 21:14
Zero, я же привел код...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)