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

Вниз

Файл 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.005 c
6-1286108067
Skyhawk99
2010-10-03 16:14
2018.04.08
Проблема с idHTTP и кирилицей


2-1460612628
Аши
2016-04-14 08:43
2018.04.08
Файл 4 гигабайта


2-1460381686
Dmk
2016-04-11 16:34
2018.04.08
Перегружаемый код


2-1460338110
Abcdef123
2016-04-11 04:28
2018.04.08
Email component


1-1357117761
shopgirl1987
2013-01-02 13:09
2018.04.08
Автоматический прием WM-платежей и Delphi