Конференция "WinAPI" » Работа с файлом на WinAPI [D7, WinXP]
 
  • Dmitry_177 (26.10.07 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 и произвести запись буфера.. Но а если файл будет слишком большим по размеру? То придется слишком большой буфер выделять.. Где этот буфер хранится? В оперативной памяти? Может ли получиться так что не хватит оперативки? Или может есть еще какой-то способ удаления какой-то записи из середины файла?
  • Сергей М. © (26.10.07 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 (26.10.07 17:03) [2]
    чтобы было проще объяснить, я ж написал к примеру..
  • Сергей М. © (26.10.07 17:08) [3]
    Читай последовательно по одной записи из входного файла и тут же записывай прочитанную запись в выходной, веди подсчет обработанных записей, как дойдешь до i10-й - не записывай ее.

    Вот и всех делов)
  • homm © (26.10.07 17:13) [4]
    читаешь в буфер 100кб с той позиции, где заканчивается удаляемая запись, пишеш буфер в позицию, где начинается удаляемая запись, читаешь в буфер 100кб с той позиции, где заканчивается удаляемая запись + 100кб, пишешь буфер в позицию, где начинается удаляемая запись + 100кб…
    Так, пока не кончится файл.
  • Dmitry_177 (26.10.07 17:14) [5]
    Вы наверно не доконца поняли.. файл один, т.е. входной и выходной один и тотже.. но это ладно.. мне кажется если по одной записи считывать это будет слишком долго.. можно же сразу с i11 до конца файла все считать а потом записать, только вот проблема в том что куда это считать, если очень много??
  • homm © (26.10.07 17:21) [6]
    > [5] Dmitry_177   (26.10.07 17:14)
    > файл один, т.е. входной и выходной один и тотже..

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

    > мне кажется если по одной записи считывать это будет слишком
    > долго..
    читай по 100кб!
 
Конференция "WinAPI" » Работа с файлом на WinAPI [D7, WinXP]
Есть новые Нет новых   [120363   +47][b:0][p:0.001]