Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.27;
Скачать: CL | DM;

Вниз

Работа с файлом на WinAPI   Найти похожие ветки 

 
Dmitry_177   (2007-10-26 16:49) [0]

Если в файл посредством функции WriteFile записано много записей, например c i1 по i10000:

WriteFile(hSaveFile, i1, SizeOf(i1), BytesWrite, nil);
WriteFile(hSaveFile, i2, SizeOf(i2), BytesWrite, nil);
WriteFile(hSaveFile, i3, SizeOf(i3), BytesWrite, nil);
...
WriteFile(hSaveFile, i10000, SizeOf(i10000), BytesWrite, nil);

и надо удалить к примеру i10 запись.. на сколько я знаю прямого удаления нету, и нужно поступить примерно так: прочитать значения с i11 до конца файла, т.е. по i10000 во временный буфер, и затем перевести указатель позиции на i10 и произвести запись буфера.. Но а если файл будет слишком большим по размеру? То придется слишком большой буфер выделять.. Где этот буфер хранится? В оперативной памяти? Может ли получиться так что не хватит оперативки? Или может есть еще какой-то способ удаления какой-то записи из середины файла?


 
Сергей М. ©   (2007-10-26 17:00) [1]


> WriteFile(hSaveFile, i1, SizeOf(i1), BytesWrite, nil);
> WriteFile(hSaveFile, i2, SizeOf(i2), BytesWrite, nil);
> WriteFile(hSaveFile, i3, SizeOf(i3), BytesWrite, nil);
> ...
> WriteFile(hSaveFile, i10000, SizeOf(i10000), BytesWrite,
>  nil);


К чему вся эта ботва ?
Неужели так трудно вместо этого сказать, что речь идет о файле, не имеющем регулярную структуру, т.е. неструктурированном ?


 
Dmitry_177   (2007-10-26 17:03) [2]

чтобы было проще объяснить, я ж написал к примеру..


 
Сергей М. ©   (2007-10-26 17:08) [3]

Читай последовательно по одной записи из входного файла и тут же записывай прочитанную запись в выходной, веди подсчет обработанных записей, как дойдешь до i10-й - не записывай ее.

Вот и всех делов)


 
homm ©   (2007-10-26 17:13) [4]

читаешь в буфер 100кб с той позиции, где заканчивается удаляемая запись, пишеш буфер в позицию, где начинается удаляемая запись, читаешь в буфер 100кб с той позиции, где заканчивается удаляемая запись + 100кб, пишешь буфер в позицию, где начинается удаляемая запись + 100кб…
Так, пока не кончится файл.


 
Dmitry_177   (2007-10-26 17:14) [5]

Вы наверно не доконца поняли.. файл один, т.е. входной и выходной один и тотже.. но это ладно.. мне кажется если по одной записи считывать это будет слишком долго.. можно же сразу с i11 до конца файла все считать а потом записать, только вот проблема в том что куда это считать, если очень много??


 
homm ©   (2007-10-26 17:21) [6]

> [5] Dmitry_177   (26.10.07 17:14)
> файл один, т.е. входной и выходной один и тотже..

нет никаких препятствий писать и читать в 1 файл.

> мне кажется если по одной записи считывать это будет слишком
> долго..
читай по 100кб!



Страницы: 1 вся ветка

Текущий архив: 2008.07.27;
Скачать: CL | DM;

Наверх




Память: 0.45 MB
Время: 0.006 c
15-1212825413
Vlad Oshin
2008-06-07 11:56
2008.07.27
чем С# вкусна?


2-1214817272
from kz
2008-06-30 13:14
2008.07.27
Оракул + Odac + Error


2-1214388914
Light-blr
2008-06-25 14:15
2008.07.27
Как отобразить на форме картинку в формате gif?


15-1211663863
Германн
2008-05-25 01:17
2008.07.27
Насколько же я могу быть тупым!


2-1214340173
lewka-serdceed
2008-06-25 00:42
2008.07.27
оперции с числами





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский