Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
1-37682
Кен
2003-12-25 02:34
2004.01.13
Как правильно проводить лексический анализ текста ? Разбиение


8-37807
Novenkij
2003-09-05 14:10
2004.01.13
И еще раз о звуке


14-37899
Shluz
2003-12-21 20:56
2004.01.13
line2003.ru


8-37811
nuflin
2003-07-01 22:03
2004.01.13
как используя TRichEdit узнть длину строки, зная ее порядковый но


6-37826
zxc
2003-11-14 13:53
2004.01.13
наверное глупый вопрос но всё же..





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский