Форум: "Начинающим";
Текущий архив: 2018.04.08;
Скачать: [xml.tar.bz2];
ВнизФайл 4 гигабайта Найти похожие ветки
← →
Аши (2016-04-14 08:43) [0]Пишется файл,
FileCreate(File, fmShareDenyWrite); ... ... FileWrite(File, Arr[0], Len);
Когда файл достигает в размере 4+ гигабайта, он перестает расти, хотя программа продолжает работать, и даже монитор процессов показывает что идет чтение и запись.
Почему так? Стоит 7-я винда 64 бит, максимальный размер файла в ней может превышать 4 гига, так что проблема наверное не в ней. Тогда почему так?
← →
sniknik © (2016-04-14 10:17) [1]видимо в тех функциях/дельфе что ты пользуешься еще старые типы определения размера/позиции, DWORD вроде. в них как раз на 4 гига байт определяется дальше идет переполнение и фактически переписывание файла с начала... ну или подобное, смотря как у тебя там сделано.
← →
Игорь Шевченко © (2016-04-14 10:37) [2]
> Почему так?
Человек тоже перестает расти со временем. И файл...
← →
Quant (2016-04-14 11:24) [3]
> Стоит 7-я винда 64 бит, максимальный размер файла в ней
> может превышать 4 гига
Максимальный размер файла не зависит от битности ОС! о___0
ФС какая на фиске? Ваши функции умеют работать с "большими файлами"?
А просто переключаться на (делать) новый файл когда он доходит до 4гб?
← →
dmk © (2016-04-14 12:40) [4]SetFilePointerEx
← →
Аши (2016-04-14 13:22) [5]
>ФС какая на фиске? Ваши функции умеют работать с "большими файлами"?
NTFS
>А просто переключаться на (делать) новый файл когда он доходит до 4гб?
не удобно для последующего чтения )
> видимо в тех функциях/дельфе что ты пользуешься еще старые
> типы определения размера/позиции, DWORD вроде. в них как
> раз на 4 гига байт определяется дальше идет переполнение
> и фактически переписывание файла с начала... ну или подобное,
> смотря как у тебя там сделано
ну судя по писанию там везде Integer
А как мне это делать исправить если функция не может обрабатывать большие файлы?)
← →
DVM © (2016-04-14 13:39) [6]
> А как мне это делать исправить если функция не может обрабатывать
> большие файлы?)
Версия Delphi какая?
← →
sniknik © (2016-04-14 13:56) [7]> ну судя по писанию там везде Integer
тогда было бы ограничение в 2гига... но возможно, оно внешне знаковое, а внутри нет, тогда все ровно выходит - максимум 4 гига.
в конце концов будет число 4294967295 или -1 это только от интерпретации зависит, физически они равны... $FFFFFFFF.
ищи другие/меняй функции/версию.
← →
Quant (2016-04-14 14:08) [8]Как-как. Писать на API или найти библиотеку-обёртку или перейти на новую версию IDE.
← →
sniknik © (2016-04-14 14:19) [9]D7 >
function THandleStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
что то мне подсказывает дело не версии.
← →
KSergey © (2016-04-14 14:50) [10]Вот так можно писать файлы больше 4 ГБ
real_len: Integer;
fwritten:DWORD;
DistanceToMoveHigh: Longint;
real_len := ......
DistanceToMoveHigh := 0;
SetFilePointer(LogFile,0,@DistanceToMoveHigh,FILE_END);
WriteFile(LogFile, log_buf_str[1], real_len, fwritten , nil);
← →
han_malign © (2016-04-14 16:49) [11]
> SetFilePointer
- пофиг, создание и запись до победного конца - не требует манипуляций с текущим указателем чтения/записи...
FileXxx - это тривиальная оболочка для Windows.XxxFile без каких либо засад(с ветвлением для POSIX open/read/write под Linux)
> и даже монитор процессов показывает что идет чтение и запись.
- правильный вопрос - как ты определяешь размер файла...
← →
Игорь Шевченко © (2016-04-14 17:20) [12]han_malign © (14.04.16 16:49) [11]
Ты слишком много хочешь от начинающих :))
← →
KSergey © (2016-04-14 17:32) [13]> han_malign © (14.04.16 16:49) [11]
Можно расшифровать этот поток?
← →
Аши (2016-04-14 17:33) [14]
> Версия Delphi какая?
Delphi 10 Seattle
не понимаю почему делфи не хочет принимать WriteFile. Ругается. Говорит слишком много указаных параметров, если указывать их по ...
BOOL WriteFile(HANDLE hFile, //собственно указатель на файл
LPVOID lpBuffer, // указатель на буфер - откуда записываем данные в файл
DWORD nNumberOfBytesToWrite, //объем записываемых данных
LPDWORD lpNumberOfBytesWrite, //фактический размер записанных данных
LPOVERLAPPED lpOverlapped // флаг режима доступа к файлу: асинхронный(FILE_FLAG_OVERLAPPED)
//или синхронный(NULL)
);
← →
Аши (2016-04-14 17:39) [15]Вот так пишу и вот так определяю длину файла.
procedure TForm1.WriteFile;
const
BuffSize = 10000;
var
DBFile, TFile : String;
TargetFile, DataBFile : THandle;
Arr : array of Byte;
SizeFile, SizeBase : longint;
len, Err, i : integer;
FileEx : bool;
begin
FileEx := false;
DBFile := "d:\1\data.f";
for I := 0 to ListBox1.Items.Count-1 do
begin
TFile := ListBox1.Items.Strings[i];
Form1.Caption := ListBox1.Items.Strings[i];
TargetFile := FileOpen(TFile, fmOpenRead + fmShareDenyWrite);
if FileExists(DBFile) then
begin
FileEx := true;
DataBFile := FileOpen(DBFile, fmOpenWrite);
end else
DataBFile := FileCreate(DBFile, fmShareDenyWrite);
SetLength(Arr, BuffSize);
try
SizeFile := FileSeek(TargetFile, 0, 2);
FileSeek(TargetFile, 0, 0);
if FileEx = true then
FileSeek(DataBFile, 0, 2);
while FileSeek(TargetFile, 0, 1) < SizeFile do begin
len := FileRead(TargetFile, Arr[0], BuffSize);
FileWrite(DataBFile, Arr[0], len);
end;
finally
FileClose(TargetFile);
FileClose(DataBFile);
end;
end;
end;
← →
Игорь Шевченко © (2016-04-14 18:02) [16]
> Вот так пишу и вот так определяю длину файла.
Неправильно определяешь. Определяй проводником.
← →
sniknik © (2016-04-14 18:16) [17]перегружаемые функции зависят от используемых тобой типов, например
function FileSeek(Handle, Offset, Origin: Integer): Integer; overload;
function FileSeek(Handle: Integer; const Offset: Int64; Origin: Integer): Int64; overload;
константы без указания вроде будут интеджером...
хочешь больших файлов используй большие размеры.
+
нафига в цикле переоткрывать TargetFile? вынеси за цикл...
++
что ты тут вообще делаешь??? смысл.
← →
Quant (2016-04-14 18:24) [18]DBFile надо вынести. Или передавать параметром в эту функцию или брать из TEdit или на худой конец в константы модуля.
TFile - префиксом T обозначаются Классы. Переименуйте в какой-нить CurrentFile.
Зачем вам THandle и FileOpen? Возьмите уже хотя бы TFileStream.
← →
Аши (2016-04-14 19:12) [19]
> Игорь Шевченко © (14.04.16 18:02) [16]
> >
> > Вот так пишу и вот так определяю длину файла.
> >
> Неправильно определяешь. Определяй проводником.
помнится лет так 5 назад ты помогал тут людям, а сейчас только чушь пишешь в нуботемах) или это только мне так повезло?)))
> Quant
> DBFile надо вынести. Или передавать параметром в эту функцию
> или брать из TEdit или на худой конец в константы модуля.
это набросок, потому что ни когда не работал с большими объемами файлов. Все сводилось максимум к 500 магабайтам лог файла, и мне этого хватало за глаза. Естесвтенно потом такие переменные как названия и адреса файлов будут передаваться в оформленную процедуру.
> TFile - префиксом T обозначаются Классы. Переименуйте в
> какой-нить CurrentFile.
TFile - назвал так так TargetFile. Совсем забыл про обозначение классов, да и делфи не ругался. Я в эклипсе привык сидеть, там свободно пользовал такой переменной, и по привычке ее и тут влепил. Переименую.
> Зачем вам THandle и FileOpen? Возьмите уже хотя бы TFileStream.
Затея в том, что перед записью будет делаться NOT для массива байт, либо еще какие то манипуляции с ними. Потоковая запись на сколько я знаю не нуждается в массивах. (либо как через нее можно сделать то что мне нужно).
> sniknik © (14.04.16 18:16) [17]
>
> перегружаемые функции зависят от используемых тобой типов,
> например
> function FileSeek(Handle, Offset, Origin: Integer): Integer;
> overload;
> function FileSeek(Handle: Integer; const Offset: Int64;
> Origin: Integer): Int64; overload;
> константы без указания вроде будут интеджером...
>
точно..... Я жестко ступил. Спасибо большое :) Теперь все работает))))
← →
Игорь Шевченко © (2016-04-14 20:59) [20]Аши (14.04.16 19:12) [19]
Если у тебя нет мозгов задать верный вопрос, чему ты удивляешься ?
← →
Rouse_ © (2016-04-14 21:45) [21]Работает, но не так надо, смени на uint64, а то еще раз наткнешся
← →
Rouse_ © (2016-04-14 21:51) [22]А на Игоря ты зря - он тебе пинок дает, а не оскорбить хочет
Меня в свое время что Игорь, что Юра Зотов так пинали - еслиб я обижался, никогда программистом бы не стал :)
← →
DVM © (2016-04-14 23:11) [23]
> Аши (14.04.16 17:33) [14]
>
> > Версия Delphi какая?
>
> Delphi 10 Seattle
>
Используй TFileStream и не мучайся.
← →
Аши (2016-04-15 11:43) [24]
> Если у тебя нет мозгов задать верный вопрос, чему ты удивляешься
> ?
У меня нет мозгов задать верный вопрос - это правда, по тому и пришел сюда, что бы знающие люди разобрались и помогли). Потому что они ну гугл, который не может найти косвенные зависимости в запросе и не умеет искать ошибки в коде. Если бы у меня были мозги задать верный вопрос гуглу - то я бы его и не задавал, потому что скорее всего сам бы догадался где кроется ответ) Ну или по крайней мере с тычка гугла. Но в силу всего вышеизложенного и в частности того, что люди в отличии от гугла умеют анализировать и находить ошибки даже косвенные, не относящиеся напрямую к вопросу, например советы по оптимизации - я и пришел (повторюсь) сюда)
> А на Игоря ты зря - он тебе пинок дает, а не оскорбить хочет
Да я и не обижаюсь, уж не маленький) И это не пинок, а скорее стёб) Пинок дает направление для поиска и изучения, а его :
> Человек тоже перестает расти со временем. И файл...
....
> Ты слишком много хочешь от начинающих :))
....
> Неправильно определяешь. Определяй проводником
...
> Если у тебя нет мозгов задать верный вопрос, чему ты удивляешься
> ?
....
не дает ровным счетом ни чего :) Просто флуд и стёб)
> Работает, но не так надо, смени на uint64, а то еще раз
> наткнешся
Благодарю) Все таки я незнайка. С числами превышающими диапазон int ни когда не имел дело) Стыдно, но так. Спасибо )
Всем спасибо, и удачи)
← →
sniknik © (2016-04-15 12:06) [25]> смени на uint64, а то еще раз наткнешся
когда файл перевалит по размеру в 8589934591 гигабайта (8388607 терабайт). ;)
← →
Игорь Шевченко © (2016-04-15 12:50) [26]http://segfault.kiev.ua/smart-questions-ru.html
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2018.04.08;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.002 c