![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с нетипизированными файлами более 2 гигабайт
rioko © (2012-06-04 13:47:00)Проблема в следующем, как перейти в конец файла посредством seek(), для записи \ чтения, если размер файла более 2.5 гигабайт, и функция
function GetFileSize(FIleName: string): integer;
var
f: file of Byte;
begin
try
AssignFile(f, FileName);
Reset(f);
result := filesize(F);
CloseFile(f);
except
result := 0;
end;
end;
.. возвращает ошибку
seek(f, getfilesize(f2))
... I\O error ...
han_malign (2012-06-04 18:05:00) [21]
> seek(f, getfilesize(f2))
hFile:= CreateFile(...);
if(hFile <> INVALID_HANDLE_VALUE )then begin
dwHigh:= 0;
dwLow:= SetFilePointer(hFile, 0, @dwHigh, FILE_END);
if( (dwLow <> $FFFFFFFF) or (GetLastError = ERROR_SUCCESS) )then
fileSize:= int64(dwHigh) shl 32 or dwLow;
...
CloseHandle(hFile);
end;
MBo (2012-06-04 14:52:00) [22]seek в BDS 2006 принимает 32-разрядный параметр
Если нужно работать с большими файлами, то технологию, вероятно, стоит сменить, наример, на Stream-ы, если в нужной версии они 64-битный размер поддерживают - в 2006 это так.)
DVM (2012-06-04 14:49:00) [23]
> rioko
Имхо, взять TFileStream и не мучаться
Palladin (2012-06-04 14:43:00) [24]
function secretFuntionName(FileName: String): Int64;
var
FindData: TWin32FindData;
hFind: THandle;
begin
Result := -1;
hFind := FindFirstFile(PChar(FileName), FindData);
if hFind <> INVALID_HANDLE_VALUE then
begin
Windows.FindClose(hFind);
if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
begin
Int64Rec(Result).Lo := FindData.nFileSizeLow;
Int64Rec(Result).Hi := FindData.nFileSizeHigh;
end;
end;
end;
Ega23 (2012-06-04 13:52:00) [25]Через TSearchRec?