Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Размер файла [D7, WinXP]


Страницы:   1 2

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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо