Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.19;
Скачать: CL | DM;

Вниз

Размер файла   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.027 c
14-1101515011
Andy BitOff
2004-11-27 03:23
2004.12.19
Дорогой IE, я ухожу от тебя навсегда


4-1099243107
vertal
2004-10-31 20:18
2004.12.19
Сообщения при попытке завершения безоконного приложения


14-1101655076
tw
2004-11-28 18:17
2004.12.19
Заставка


14-1101999308
Denis_
2004-12-02 17:55
2004.12.19
Где скачать русско-англиский словарь?


1-1101800468
Viktop
2004-11-30 10:41
2004.12.19
Уникальное имя