![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Размер файла [D7, WinXP]
Logs © (2004-12-06 19:01:00)Здравствуйте! Подскажите пожалуйста такую вещь. Пишу
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". Что делать??
Fay (2004-12-07 23:04:00) [1]На свопе-то я и не проверил 8).
GuAV (2004-12-07 22:55:00) [2]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 22:44:00) [3]2 GuAV © (07.12.04 22:35) [23]
>> Тем что файл может не открыться с FILE_SHARE_READ
Согласен. Но мне не удалось добиться такой ситуации. Не подскажете, как это сделать?
GuAV (2004-12-07 22:35:00) [4]Тем что файл может не открыться с FILE_SHARE_READ.
Не вникал, можно ли там писать FILE_GET_ATTRIBUTES, но факт что FindFirstFile найдёт любой файл, если он существует.
Fay (2004-12-07 22:27:00) [5]2 GuAV © (07.12.04 22:19) [21]
А можно узнать - чем лучший?
GuAV (2004-12-07 22:19:00) [6]Logs (07.12.04 21:58) [20]
но он размер неправильно определяет.
Не правильно 4 ГБ и более.
Лучший способ узнать размер - через FindFirstFile, в lpFindFileData есть DWORD nFileSizeHigh;
DWORD nFileSizeLow;
Logs (2004-12-07 21:58:00) [7]Спасибо всем кто написал!
Начсчет глючности: я строка конечно учел, но он размер неправильно определяет.
Буду пробовать другие советы!
Fay (2004-12-07 00:26:00) [8]GuAV © (06.12.04 23:25) [18]
Да, это меня просто колбасит - только проснулся когда писал.
GuAV (2004-12-06 23:25:00) [9]Fay © (06.12.04 21:04) [14]
the return value is INVALID_FILE_SIZE andGetLastError 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;
Yanis (2004-12-06 23:10:00) [10]Блин, т.е. две буквы l.
[16] - не правильно.
Yanis (2004-12-06 22:44:00) [11]> Ошибка такая: компилятор не понимает "_lseek". Что делать??
Две чёрточки ставить надо перед именем функции:
__lseek
begin...end (2004-12-06 21:36:00) [12]> [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-)
Fay (2004-12-06 21:04:00) [13]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.
GuAV (2004-12-06 20:42:00) [14]Fay © (06.12.04 19:53) [7]
if (LARGE_INTEGER(Result).LowPart = INVALID_FILE_SIZE) or(GetLastError <> NO_ERROR) then RaiseLastOsError;
and, not or ! :)
GuAV (2004-12-06 20:40:00) [15]begin...end © (06.12.04 20:05) [9]
var I: Int64;
begin
...
Int64Rec(I).Lo := GetFileSize(..., @Int64Rec(I).Hi);
...
end
и всё :)
Fay (2004-12-06 20:11:00) [16]2 begin...end © (06.12.04 20:05) [10]
8)
begin...end (2004-12-06 20:05:00) [17]Блин, ещё и намешал Order с Part... :-(
begin...end (2004-12-06 20:05:00) [18]> [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 вообще-то со знаком... :-)
Позор мне! Старею, наверное... :-(
Fay (2004-12-06 20:00:00) [19]По поводу вопроса в том виде, в котором он был задан.
>> Ошибка такая: компилятор не понимает "_lseek". Что делать??
_llseek
Fay (2004-12-06 19:53:00) [20]Видимо смутила строка '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;