Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
ВнизРазмер файла Найти похожие ветки
← →
Antonmm (2004-08-29 17:38) [0]Как с помощью своей программы узнать размер файла?
← →
Anatoly Podgoretsky © (2004-08-29 17:39) [1]FileSize
← →
begin...end © (2004-08-29 18:13) [2]
> Antonmm (29.08.04 17:38)
В дополнение к [1]: этот способ удобен, если ты пользуешься файловой переменной. Если это не так, т.е. тебе нужно узнать размер файла, находящегося по заданному пути, лучше, ИМХО, использовать функцию FileSizeByName() из модуля idGlobal.
← →
Antonn © (2004-08-29 19:07) [3]Возвращает размер в байтах:
function GetFileSize(FileName: String): Integer;
var
FS: TFileStream;
begin
try
FS := TFileStream.Create(Filename, fmOpenRead);
except
Result := -1;
end;
if Result <> -1 then Result := FS.Size;
FS.Free;
end;
← →
GuAV © (2004-08-29 19:21) [4]
> except
> Result := -1;
> end;
ИМХО зря...
> if Result <> -1 then Result := FS.Size;
не компилил но варнинг угадаю, и он по существу будет.
короче, [3] - бред, или [1] или [2] или GetFileSize/GetFileSizeEx
← →
Внук © (2004-08-29 19:34) [5]>>Как с помощью своей программы узнать размер файла?
С помощью своей - просто, вот с помощью чужой...
← →
Anatoly Podgoretsky © (2004-08-29 19:56) [6]GuAV © (29.08.04 19:21) [4]
Мелочь, а вот в некоторых случаях будет гадать, почему программа не работает :-)
Ошибок по крайней мере 2
← →
GuAV © (2004-08-29 20:08) [7]
> Ошибок по крайней мере 2
А я три вижу:
Одна - TFileStream.Create(Filename, fmOpenRead); не получилось (реально, если в имени недопустимый символ) - Free всё же вызван.
Вторая - Result без except мусор => м.б. и -1
Третья - FS.Size - не получилось - Free не вызван.
+ Недочет - не надо гасить исключение, оно ещё пригодилось бы.
← →
Anatoly Podgoretsky © (2004-08-29 20:16) [8]1. Free вызван объект не создан, получаем новую ошибку
2. Открыть не получилось, нет прав
3. Открыли, но в это время другая программа хочет открыть монопольно, получит по зубам
4. Все нормально открыли, но из за неинициализации можем получить размер -1
Как было сказано - это как минимум, а максимум искать не хочется.
Из за пунктов 2 и 3 нет смысла устранять другие ошибки.
← →
GuAV © (2004-08-29 20:27) [9]
> 3. Открыли, но в это время другая программа хочет открыть
> монопольно, получит по зубам
Подробнее, если можно, что именно Вы имеете ввиду.
← →
jack128 © (2004-08-29 20:39) [10]GuAV © (29.08.04 20:27) [9]
что открывать нужно с флагом fmShareDenyRead
← →
GuAV © (2004-08-29 20:51) [11]
> fmShareDenyRead
понял.
← →
Anatoly Podgoretsky © (2004-08-29 20:52) [12]GuAV © (29.08.04 20:27) [9]
Программа заперашивает монопольное использование, а в это время файл открыт этой функции, будет ошибка открытия. В тоже время можно получать размер не открывая файлов и не имея прав на чтение и запись, достаточно только на просмотр каталога. Вот при таком случае программ не доставит неприятностей не себе ни что более важно другим программам.
jack128 © (29.08.04 20:39) [10]
Не нужно, это все равно неверно. FindFirst
← →
GuAV © (2004-08-29 21:07) [13]
> В тоже время можно получать размер не открывая файлов и
> не имея прав на чтение и запись, достаточно только на просмотр
> каталога.
Да но ведь не ошибка, а недочёт, что не получается там где могло и получится. Вот мемлик, AV, и русская рулетка с result - это ИМХО хуже.
← →
KilkennyCat © (2004-08-29 21:11) [14]А я знаю самый жуткий способ!
1. Запустить из своей проги проводник.
2. Открыть в нем папку с необходимым файлом.
3. выбрать режим просмотра "таблица".
4. Выделить нужный файл.
5. скопировать изображение выделенного.
6. распознать надпись о размере.
← →
GuAV © (2004-08-29 23:54) [15]<off>
KilkennyCat © (29.08.04 21:11) [14]
я тоже шел юзать умею ;-)function GetLibString(const Lib: PChar;
</off>
ID: LongWord; Size: Integer): string;
var hDll: THandle;
begin
hDll := LoadLibrary(Lib);
if hDll=0 then RaiseLastOSError;
try
SetLength(Result, Size);
SetLength(Result, LoadString(hDll, ID, @Result[1], Size));
finally
FreeLibrary(hDll);
end;
end;
procedure CheckFileName(const S: string);
const D="\/:*?"<>|";
var I: Integer;
begin
for I:=1 to Length(D) do
if StrScan(PChar(S), D[I])<>nil then
raise Exception.Create(GetLibString(shell32, 4109, 128));
end;
← →
KilkennyCat © (2004-08-30 03:32) [16]
> GuAV © (29.08.04 23:54) [15]
Не, нечестно! :)
Я 5-ый и 6-ой пункты предполагал работу с графикой!
← →
GuAV © (2004-08-30 11:17) [17]KilkennyCat © (30.08.04 03:32) [16]
В моём случае юзать графику труднее чем в сабжевом
Кстати, ВордДок будет так же работать ?
← →
[lamer]Barmaglot © (2004-08-30 11:29) [18]Самый быстрый вариант, как это не странно FindFirst...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.053 c