Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.034 c
15-1164472211
Yegorchic
2006-11-25 19:30
2006.12.17
Как можно получить таблицу импорта exe


15-1164552740
ShellX
2006-11-26 17:52
2006.12.17
Интересная задачка


15-1163760223
vecna
2006-11-17 13:43
2006.12.17
Где в Москве купить ODAC?


15-1164680365
ehhho
2006-11-28 05:19
2006.12.17
Гуру PHP


3-1160470925
Megabyte
2006-10-10 13:02
2006.12.17
Правильный запрос или другой метод расчета