Форум: "Основная";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];
ВнизКак правильно узнать размер файла... Найти похожие ветки
← →
maxfiles (2003-12-23 23:54) [0]Поясняю ситуацию:
Часть кода находит MP3 файл, и пытается спозиционироваться на конец файла, где хранятся данные о ID3 теге.
Глюк заключается в том, что если запись в этот каталог запрещена (например, если чтение идет с сидюка), то FileSize возвращает -1. (Причем только в win2000, а в win98 все работает). В чем глюк не пойму:
....
asd:= seek_path; // переменная с полным путем и файлом
AssignFile(f, asd);
Reset(f);
size:=filesize(f); // получение размера... возвращает -1
Seek(f,size - 128); // Разумеется, чтение начинается с начала :(
blockread(f,buf,sizeof(buf), Numread);
{$i-}
if (buf[1]="T") and (buf[2]="A") and (buf[3]="G")
then begin
Song:=trim(copy(buf,4,30));
Author:=trim(copy(buf,34,30));
if song <>"" then
.....
Подозрения падают на тою что может быть программа пытается создать на сидюке временный файл? Хотя я ничего подобного не заметил.
спасибо..
Поправьте, если найдете глюк
← →
Dimaxx (2003-12-24 02:01) [1]Попробуй получить размер через FindFist, указав путь и имя файла полностью (без шаблона) и читай размер из переменной типа TSearchRec.
← →
maxfiles (2003-12-24 02:35) [2]Попробовал... Через FindFirst. Получилось следующее:
Размер пришел верный, однако по непонятным причинам Seek опять не спозиционировалась на конец файла... И обсолютно непонятно в чем дело.. нет ни ошибки ни чего... :(
Чтение начинается попрежнему от начала файла.
← →
Kerk (2003-12-24 13:11) [3]попробуй Reset(f,1)
← →
maxfiles (2003-12-24 21:53) [4]А что такое Reset(f,1)? Delphi такое обращение не понял... да и я тоже.
Кстати говоря, если просмотреть IOResult, то оно возвращает "5" что означает "Доступ запрещен"....
совсем ерунда какая-то..
← →
Anatoly Podgoretsky (2003-12-24 21:59) [5]Где определение F?
← →
maxfiles (2003-12-25 02:56) [6]..
procedure tform4.analyzing(const filename,dirname:string);
var
asd:string;
f: file of Byte;
...
F объявлена в процедурке, а не в глобальном VAR-e
← →
Slym (2003-12-25 06:11) [7]hFile:=CreateFile("d:\music.mp3",GENERIC_READ,FILE_SHARE_READ,nill,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,null);
SetFilePointer(hFile,128,nill,FILE_END);
ReadFile(hFile,@buf,128,@readed,nill);
← →
wicked (2003-12-25 12:10) [8]кстати, если уж на то пошло, то id3 таг может находиться где угодно в теле файла... лучше его сканировать на предмет наличия TAG...
← →
Kerk (2003-12-25 12:29) [9]
> maxfiles (24.12.03 21:53) [4]
Ты уверен, что Delphi такое обращение не понял?
← →
maxfiles (2003-12-26 00:43) [10]Да, я проверил... Вот такая ошибка:
Too many actual parametrs
Description
This error message occurs when a procedure or function call gives more parameters than the procedure or function declaration specifies. Additionally, this error message occurs when an OLE automation call has too many (more than 255), or too many named parameters.
← →
maxfiles (2003-12-26 00:50) [11]Я решил сегодня эту проблемку.. Короче, дело обстоит так... Seek не работает непонятно почему, а вот предложенный вариант через API подошел... Только я его несколько переделал (потому что первоначальный вариант несколько неверный был :) )
Вот текст:
fillchar(buf,sizeof(buf),0);
hFile:=Windows.CreateFile("k:\Wave01.mp3",GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
tttt:=Windows.SetFilePointer(hFile,-128,nil,FILE_END);
Windows.ReadFile(hFile,buf,128,Result,nil);
windows.closehandle(hfile);
Теперь в переменной buf содержится ID3 Тег MP3 файла...
← →
nekto (2003-12-26 13:44) [12]есть же какая то API функция для определения размера без открытия...
← →
Kerk (2003-12-27 12:47) [13]
> nekto (26.12.03 13:44) [12]
GetFileSize
чтобы не открывать файл в функции CreateFile в поле dwDesiredAccess напиши 0
← →
Anatoly Podgoretsky (2003-12-27 12:57) [14]maxfiles (25.12.03 02:56) [6]
Тогда все написано правильно, за исключением следующих вещей:
1. Не видно установки FileMode
2. Не видно проверки на допустимость, скажем хотя бы длины
3. Не известно состояния флага обработки ошибок, по всей видимости установлено игнорирование, иначе бы было исключение.
← →
Anatoly Podgoretsky (2003-12-27 12:59) [15]Вместо использования типизированого файла, в данном случае правильнее использовать класс TFileStream - программа будет проще и надежнее.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c