Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1460338110
Abcdef123
2016-04-11 04:28
2018.04.08
Email component


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


6-1286108067
Skyhawk99
2010-10-03 16:14
2018.04.08
Проблема с idHTTP и кирилицей


15-1470771674
NailMan
2016-08-09 22:41
2018.04.08
Мой первый боевой девайс на Arduino полетел!


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





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