Форум: "Основная";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
ВнизРазмер файла Найти похожие ветки
← →
Logs (2004-12-06 19:01) [0]Здравствуйте! Подскажите пожалуйста такую вещь. Пишу
function file_size(path:string):integer;
var
f:HFile;
begin
f:=_lopen(PChar(path),of_read);
file_size:=_lseek(f,o,file_end);
_lclose(f);
end;
end;
компилятор не опнимает
Ошибка такая: компилятор не понимает "_lseek". Что делать??
← →
begin...end © (2004-12-06 19:07) [1]> Logs (06.12.04 19:01)
> Ошибка такая: компилятор не понимает "_lseek". Что делать??
Исправить ошибку в написании функции.
Кстати, а чем не устраивают CreateFile/GetFileSize?
← →
Logs (2004-12-06 19:13) [2]
> ить ошибку в написании функции.
>
> Кстати, а чем не устраивают CreateFile/GetFileSize?
А как ими пользоваться?
← →
Fay © (2004-12-06 19:20) [3]Для файлов размером до 4Gb можно так
function File_Size(s : string) : DWORD;
var
h : DWORD;
begin
h := CreateFile("c:\boot.ini", 0, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if h = INVALID_HANDLE_VALUE then RaiseLastOsError;
try
Result := GetFileSize(h, nil);
if Result = INVALID_FILE_SIZE then RaiseLastOsError;
finally
CloseHandle(h);
end;
end;
← →
Logs (2004-12-06 19:26) [4]А другого способа нет?
А то этот слишком глючный.
← →
Fay © (2004-12-06 19:29) [5]2 Logs (06.12.04 19:26) [4]
Сам ты глючный. Слишком.
← →
begin...end © (2004-12-06 19:46) [6]> [4] Logs (06.12.04 19:26)
> А то этот слишком глючный.
И в чём глючность?
← →
Fay © (2004-12-06 19:53) [7]Видимо смутила строка "c:\boot.ini" 8). Она нечаяно там сохранилась.
А вот так можно получить размер любого файла :function File_Size(s : string) : Int64;
var
h : DWORD;
begin
h := CreateFile(PChar(s), 0, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if h = INVALID_HANDLE_VALUE then RaiseLastOsError;
try
LARGE_INTEGER(Result).LowPart := GetFileSize(h, @(LARGE_INTEGER(Result).HighPart));
if (LARGE_INTEGER(Result).LowPart = INVALID_FILE_SIZE) or (GetLastError <> NO_ERROR) then RaiseLastOsError;
finally
CloseHandle(h);
end;
end;
← →
Fay © (2004-12-06 20:00) [8]По поводу вопроса в том виде, в котором он был задан.
>> Ошибка такая: компилятор не понимает "_lseek". Что делать??_llseek
← →
begin...end © (2004-12-06 20:05) [9]> [7] Fay © (06.12.04 19:53)
А я только что пытался получить полный размер так:var
LowPart, HighPart: Cardinal;
FullSize: Int64;
begin
LowOrder := GetFileSize(..., @HighPart);
FullSize := LowOrder or (HighOrder shl 32)
end
пока не вспомнил, то Int64 вообще-то со знаком... :-)
Позор мне! Старею, наверное... :-(
← →
begin...end © (2004-12-06 20:05) [10]Блин, ещё и намешал Order с Part... :-(
← →
Fay © (2004-12-06 20:11) [11]2 begin...end © (06.12.04 20:05) [10]
8)
← →
GuAV © (2004-12-06 20:40) [12]begin...end © (06.12.04 20:05) [9]
var I: Int64;
begin
...Int64Rec(I).Lo := GetFileSize(..., @Int64Rec(I).Hi);
...
end
и всё :)
← →
GuAV © (2004-12-06 20:42) [13]Fay © (06.12.04 19:53) [7]
if (LARGE_INTEGER(Result).LowPart = INVALID_FILE_SIZE) or (GetLastError <> NO_ERROR) then RaiseLastOsError;
and, not or ! :)
← →
Fay © (2004-12-06 21:04) [14]2 GuAV © (06.12.04 20:42) [13]
If the function fails and lpFileSizeHigh is non-NULL, the return value is INVALID_FILE_SIZE and GetLastError will return a value other than NO_ERROR.
← →
begin...end © (2004-12-06 21:36) [15]> [12] GuAV © (06.12.04 20:40)
Ещё вариант (пишу из сумасшедшего дома):var
ArrValue: array [0..1] of Cardinal;
Value: Int64 absolute ArrValue[0];
begin
ArrValue[0] := GetFileSize(..., @ArrValue[1]);
end.
8-)
← →
Yanis © (2004-12-06 22:44) [16]> Ошибка такая: компилятор не понимает "_lseek". Что делать??
Две чёрточки ставить надо перед именем функции:
__lseek
← →
Yanis © (2004-12-06 23:10) [17]Блин, т.е. две буквы l.
[16] - не правильно.
← →
GuAV © (2004-12-06 23:25) [18]Fay © (06.12.04 21:04) [14]
the return value is INVALID_FILE_SIZE and GetLastError will return a value other than NO_ERROR.
То есть если the return value is INVALID_FILE_SIZE, то необязательно что the function failed.
поэтому
Fay © (06.12.04 19:53) [7]
if (LARGE_INTEGER(Result).LowPart = INVALID_FILE_SIZE) or (GetLastError <> NO_ERROR) then RaiseLastOsError;
неверно, надо
if (LARGE_INTEGER(Result).LowPart = INVALID_FILE_SIZE) and (GetLastError <> NO_ERROR) then RaiseLastOsError;
или
if (LARGE_INTEGER(Result).LowPart = INVALID_FILE_SIZE) then
begin
if (GetLastError <> NO_ERROR) then RaiseLastOsError;
end;
← →
Fay © (2004-12-07 00:26) [19]GuAV © (06.12.04 23:25) [18]
Да, это меня просто колбасит - только проснулся когда писал.
← →
Logs (2004-12-07 21:58) [20]Спасибо всем кто написал!
Начсчет глючности: я строка конечно учел, но он размер неправильно определяет.
Буду пробовать другие советы!
← →
GuAV © (2004-12-07 22:19) [21]Logs (07.12.04 21:58) [20]
но он размер неправильно определяет.
Не правильно 4 ГБ и более.
Лучший способ узнать размер - через FindFirstFile, в lpFindFileData есть DWORD nFileSizeHigh;
DWORD nFileSizeLow;
← →
Fay © (2004-12-07 22:27) [22]2 GuAV © (07.12.04 22:19) [21]
А можно узнать - чем лучший?
← →
GuAV © (2004-12-07 22:35) [23]Тем что файл может не открыться с FILE_SHARE_READ.
Не вникал, можно ли там писать FILE_GET_ATTRIBUTES, но факт что FindFirstFile найдёт любой файл, если он существует.
← →
Fay © (2004-12-07 22:44) [24]2 GuAV © (07.12.04 22:35) [23]
>> Тем что файл может не открыться с FILE_SHARE_READ
Согласен. Но мне не удалось добиться такой ситуации. Не подскажете, как это сделать?
← →
GuAV © (2004-12-07 22:55) [25]procedure TForm1.Button1Click(Sender: TObject);
begin
File_Size("C:\WIN386.SWP"); // swap file
end;
procedure TForm1.Button2Click(Sender: TObject);
var F: textfile;
begin
AssignFile(F, "c:\autoexec.bat");
Append(F);
File_Size("c:\autoexec.bat"); // open file
CloseFile(F);
end;
← →
Fay © (2004-12-07 23:04) [26]На свопе-то я и не проверил 8).
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.037 c