Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Удаление конца большого файла


Автор: crazylam 2.6.2007, 11:54
Здравствуйте! У меня такая проблема:

Надо удалить данные из конца большого файла ("обрезать"). Нашел функцию chsize и пишу так:

Код

#include <io.h>
#include <fcntl.h>

int main()
{
    int fh;
    if ( (fh = open( "file.dat", _O_RDWR)) != -1) {
        chsize( fh, 45000000 );
    }
    return 0;
}



Но оно не работает на файлах > 4Гб (даже не открывается :(). Есть ли какое-то решение? Или можно отрезать конец как-то по-другом? Подойдет любой способ, работающий по времени хотя бы за длину удаляемого куска или быстрее...

Автор: apook 2.6.2007, 12:28
попробовал твой код на NTFS диске 6 Гб файл изменил без ошибок

Автор: CrazyPerson 2.6.2007, 14:15
Странно - у меня не на 4, не на 6 гигабайтах не заработало...

Автор: W4FhLF 2.6.2007, 14:29
CrazyPerson, что написано в справке к функции? Какого типа второй параметр? DWORD, QWORD? Всё будет зависеть от этого. И под какую систему надо?

Автор: CrazyPerson 2.6.2007, 15:30
W4FhLF, У chsize Второй параметр имеет тип long. Система - windows xp, среда разработки visual studio 2005.
Но проблема возникает при достижение open, файл большого размера просто не открывается.

Автор: W4FhLF 2.6.2007, 15:53
CrazyPerson, что тогда возвращает open? 

Так же  ты можешь использовать API: CreateFile, SetFilePointer и SetFileValidData, они позволяют работать с большими файлами. В прицнипе все стандартные функции есть обёртки над системными, поэтому я обычно предпочитаю апиsmile

Автор: CrazyPerson 2.6.2007, 16:22
open возвращает handle файла, или -1 если файл не удалось открыть.
А за API'шные функции спасибо, пойду их мучать. Не можешь написать код с использованием SetFileValidData? smile 

Автор: W4FhLF 2.6.2007, 16:31
Цитата(CrazyPerson @  2.6.2007,  16:22 Найти цитируемый пост)
open возвращает handle файла, или -1 если файл не удалось открыть.


А доступ к нему есть? Может он занят другим приложением или only read? 

Цитата(CrazyPerson @  2.6.2007,  16:22 Найти цитируемый пост)
А за API'шные функции спасибо, пойду их мучать. Не можешь написать код с использованием SetFileValidData?  


Нет, у меня на этом компе нет ни студии, ни MSDN, поэтому или до понедельника, или сам smile



Автор: CrazyPerson 2.6.2007, 16:36
Доступ к файлу точно есть. Видимо просто не работает процедура с такими большими файлами...
Надеюсь что до понедельника уже разберусь с SetFileValidData, но так или иначе большое тебе спасибо.

Автор: dumb 2.6.2007, 16:48
Цитата(CrazyPerson @  2.6.2007,  16:36 Найти цитируемый пост)
Надеюсь что до понедельника уже разберусь с SetFileValidData

только тебе нужно разбираться с SetFilePointer,SetEndOfFile. и есть подозрение, что гугл может сильно облегчить это разбирательство.

Автор: CrazyPerson 2.6.2007, 16:55
msdn уже сильно облегчил это разбирательство=)

Автор: Xenon 2.6.2007, 22:11
crazylam, а у тебя какая FS ?

Автор: crazylam 3.6.2007, 15:28
NTFS...

Сейчас вроде бы проблема решилась... По крайней мере апишные функции маленькие файлы режут нормально, большие по идее тоже должна, осталось потратить 5 минут и понять, какие куда биты (младшие-старшие) надо писать в SetFilePointer(..);... так что всем спасибо smile

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