Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.033 c
1-1102155767
ньюбик
2004-12-04 13:22
2004.12.19
TStatusBar - пара простых вопросов.


14-1101557346
gn
2004-11-27 15:09
2004.12.19
Китайское правительство ограничит использование заграничного ПО


4-1099583763
heady
2004-11-04 18:56
2004.12.19
И снова выбор каталога


6-1096999715
santey
2004-10-05 22:08
2004.12.19
как поменять ip local host


3-1100686021
room
2004-11-17 13:07
2004.12.19
непонятная ошибка клиента ms sql server





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский