Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Файл 4 гигабайта


Страницы:   1 2

Аши ©   (2016-04-14 08:43:00) 

Пишется файл, FileCreate(File, fmShareDenyWrite); ... ... FileWrite(File, Arr[0], Len);
Когда файл достигает в размере 4+ гигабайта, он перестает расти, хотя программа продолжает работать, и даже монитор процессов показывает что идет чтение и запись.
Почему так? Стоит 7-я винда  64 бит, максимальный размер файла в ней может превышать 4 гига, так что проблема наверное не в ней. Тогда почему так?


Игорь Шевченко   (2016-04-15 12:50:00) [1]

http://segfault.kiev.ua/smart-questions-ru.html


sniknik   (2016-04-15 12:06:00) [2]

> смени на uint64, а то еще раз наткнешся
когда файл перевалит по размеру в 8589934591 гигабайта (8388607 терабайт). ;)


Аши   (2016-04-15 11:43:00) [3]


> Если у тебя нет мозгов задать верный вопрос, чему ты удивляешься
> ?

У меня нет мозгов задать верный вопрос - это правда, по тому и пришел сюда, что бы знающие люди разобрались и помогли). Потому что они ну гугл, который не может найти косвенные зависимости в запросе и не умеет искать ошибки в коде. Если бы у меня были мозги задать верный вопрос гуглу - то я бы его и не задавал, потому что скорее всего сам бы догадался где кроется ответ) Ну или по крайней мере с тычка гугла. Но в силу всего вышеизложенного и в частности того, что люди в отличии от гугла умеют анализировать и находить ошибки даже косвенные, не относящиеся напрямую к вопросу, например советы по оптимизации - я и пришел (повторюсь) сюда)


> А на Игоря ты зря - он тебе пинок дает, а не оскорбить хочет

Да я и не обижаюсь, уж не маленький) И это не пинок, а скорее стёб) Пинок дает направление для поиска и изучения, а его :

> Человек тоже перестает расти со временем. И файл...
....

> Ты слишком много хочешь от начинающих :))
....

> Неправильно определяешь. Определяй проводником
...

> Если у тебя нет мозгов задать верный вопрос, чему ты удивляешься
> ?
....

не дает ровным счетом ни чего :) Просто флуд и стёб)


> Работает, но не так надо, смени на uint64, а то еще раз
> наткнешся

Благодарю) Все таки я незнайка. С числами превышающими диапазон int ни когда не имел дело) Стыдно, но так. Спасибо )

Всем спасибо, и удачи)


DVM   (2016-04-14 23:11:00) [4]


> Аши   (14.04.16 17:33) [14]
>
> > Версия Delphi какая?
>
> Delphi 10 Seattle
>

Используй TFileStream и не мучайся.


Rouse_   (2016-04-14 21:51:00) [5]

А на Игоря ты зря - он тебе пинок дает, а не оскорбить хочет
Меня в свое время что Игорь, что Юра Зотов так пинали - еслиб я обижался, никогда программистом бы не стал :)


Rouse_   (2016-04-14 21:45:00) [6]

Работает, но не так надо, смени на uint64, а то еще раз наткнешся


Игорь Шевченко   (2016-04-14 20:59:00) [7]

Аши   (14.04.16 19:12) [19]

Если у тебя нет мозгов задать верный вопрос, чему ты удивляешься ?


Аши   (2016-04-14 19:12:00) [8]


> Игорь Шевченко ©   (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;
> константы без указания вроде будут интеджером...
>

точно..... Я жестко ступил. Спасибо большое :) Теперь все работает))))


Quant   (2016-04-14 18:24:00) [9]

DBFile надо вынести. Или передавать параметром в эту функцию или брать из TEdit или на худой конец в константы модуля.
TFile - префиксом T обозначаются Классы. Переименуйте в какой-нить CurrentFile.
Зачем вам THandle и FileOpen? Возьмите уже хотя бы TFileStream.


sniknik   (2016-04-14 18:16:00) [10]

перегружаемые функции зависят от используемых тобой типов, например
function FileSeek(Handle, Offset, Origin: Integer): Integer; overload;
function FileSeek(Handle: Integer; const Offset: Int64; Origin: Integer): Int64; overload;
константы без указания вроде будут интеджером...

хочешь больших файлов используй большие размеры.

+
нафига в цикле переоткрывать TargetFile? вынеси за цикл...

++
что ты тут вообще делаешь??? смысл.


Игорь Шевченко   (2016-04-14 18:02:00) [11]


> Вот так пишу и вот так определяю длину файла.


Неправильно определяешь. Определяй проводником.


Аши   (2016-04-14 17:39:00) [12]

Вот так пишу и вот так определяю длину файла.


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 17:33:00) [13]


> Версия Delphi какая?

Delphi 10 Seattle

не понимаю почему делфи не хочет принимать WriteFile.  Ругается. Говорит слишком много указаных параметров, если указывать их по ...


BOOL WriteFile(HANDLE hFile, //собственно указатель на файл
        LPVOID lpBuffer,  // указатель на буфер - откуда записываем данные в  файл
        DWORD nNumberOfBytesToWrite, //объем записываемых данных
        LPDWORD lpNumberOfBytesWrite, //фактический размер записанных данных
        LPOVERLAPPED lpOverlapped   // флаг режима доступа к файлу: асинхронный(FILE_FLAG_OVERLAPPED)

                                   //или синхронный(NULL)

);


KSergey   (2016-04-14 17:32:00) [14]

> han_malign ©   (14.04.16 16:49) [11]

Можно расшифровать этот поток?


Игорь Шевченко   (2016-04-14 17:20:00) [15]

han_malign ©   (14.04.16 16:49) [11]

Ты слишком много хочешь от начинающих :))


han_malign   (2016-04-14 16:49:00) [16]


> SetFilePointer

- пофиг, созданиеи запись до победного конца - не требует манипуляций с текущим указателем чтения/записи...
FileXxx - это тривиальная оболочка для Windows.XxxFile без каких либо засад(с ветвлением для POSIX open/read/write под Linux)

>  и даже монитор процессов показывает что идет чтение и запись.

- правильный вопрос - как ты определяешь размер файла...


KSergey   (2016-04-14 14:50:00) [17]

Вот так можно писать файлы больше 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);


sniknik   (2016-04-14 14:19:00) [18]

D7 >
function THandleStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
что то мне подсказывает дело не версии.


Quant   (2016-04-14 14:08:00) [19]

Как-как. Писать на API или найти библиотеку-обёртку или перейти на новую версию IDE.


sniknik   (2016-04-14 13:56:00) [20]

> ну судя по писанию там везде Integer
тогда было бы ограничение в 2гига... но возможно, оно внешне знаковое, а внутри нет, тогда все ровно выходит - максимум 4 гига.
в конце концов будет число 4294967295 или -1 это только от интерпретации зависит, физически они равны... $FFFFFFFF.

ищи другие/меняй функции/версию.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо