Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];

Вниз

Удалить первые 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.048 c
2-1164618841
alex810
2006-11-27 12:14
2006.12.17
DBVhart


3-1160398023
Guest10
2006-10-09 16:47
2006.12.17
Замедление работы сервера


5-1145166321
svd71
2006-04-16 09:45
2006.12.17
Не работают редакторы свойств и компонентов после ПЕРЕ-компиляции


2-1163964531
flock
2006-11-19 22:28
2006.12.17
Число


3-1160381969
Prohor
2006-10-09 12:19
2006.12.17
Загрузить из Lines в TreeView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский