Дорогие программисты не могу понять в чем дело.
Есть код:
var i,z,x:integer;
size:Longint;
f:file of Byte;
item:TListItem;
begin
memo1.Clear;
x:= ListView1.Items.Count - 1;
for i := 0 to listView1.items.count -1 do begin
item := ListView1.Items[i];
try
AssignFile(f,item.Caption);
reset(f);
size := filesize(f);
memo1.Lines.Add(IntToStr(size));
finally
closefile(f);
end;
end;
end;
вроде все нормально начинает работать, но под конец списка ругается на reset(f); пишет что " File access denied". Как ни крутил все равно. Подскажите пожалуйста в чем дело?
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
02-01-2008 07:14 | Комментарий к предыдущим ответам
>>> полюбому надо использовать оба варианта
В случае отсутствия прав на чтение не совсем понятен смысл получения размера файла - ведь это число не просто распечатать на принтере надо, а как-то использовать, посчитать занимаемое место на диске, например.
17-12-2007 13:16 | Комментарий к предыдущим ответам
>>> а реализация функции ничего не напоминает?
Да, совсем забыл, в оригинальном модуле действительно так. Это мои проделки по доработке модуля, функция в котором теперь выглядит вот так:
function GetFileSize(const FileName:string):Int64;
var Stream:TFileStream;
begin
try
Stream:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite);
Result:=Stream.Size;
Stream.Free;
except
Result:=-1;
end;
end;
05-12-2007 08:52 | Комментарий к предыдущим ответам
а реализация функции ничего не напоминает?
function GetFileSize(const FileName: string): LongInt;
var
SearchRec: TSearchRec;
begin
try
if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then
Result := SearchRec.Size
else Result := -1;
finally
SysUtils.FindClose(SearchRec);
end;
end;
02-04-2007 14:31 | Комментарий к предыдущим ответам
>>> то можно (и лучше) вообще сделать так
Где-то я читал, что у пользователя может быть право на чтение файла и не быть прав на просмотр каталога (не знаю, правда или нет), тогда FindFirst функция обломится, тогда как штатно все-равно можно получить с помощью например function GetFileSize(const FileName: string): LongInt; из модуля fmxUtils.pas, поставляемого среди демок Delphi при стандартной установке.
Я немного неправильно написал вам код, чтобы не было утечек памяти, нужно так:
var
Rec: TSearchRec;
begin
if FindFirst(item.Caption,faAnyFile,Rec) = 0 then begin
memo1.Lines.Add(IntToStr(Rec.Size));
end
else begin
// Файл не найден или нет прав доступа
end;
FindClose(Rec); // В любом случае
end;
Т.е если в строке reset(f) произойдет исключение, файл не будет открыт, управление передастся в блок finally - в строку closefile. И какой файл она должна будет закрыть, если он не был открыт??? Может стоит сначала проверять, существует ли файл (FileExist)? И вообще, вот так делать правлильно:
Совет на будущее - не используйте AssignFile, Reset и прочие устаревшие методы работы с файлами.
var
FS: TFileStream;
begin
FS:=TFileStream.Create(item.Caption,fmOpenRead);
try
memo1.Lines.Add(IntToStr(FS.Size));
finally
FS.Free;
end;
end;
Если нужно узнать только размер файла, то можно (и лучше) вообще сделать так:
var
Rec: TSearchRec;
begin
if FindFirst(item.Caption,faAnyFile,Rec) = 0 then begin
memo1.Lines.Add(IntToStr(Rec.Size));
FindClose(Rec);
end
else begin
// Файл не найден или нет прав доступа
end;
end;
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.