Главная страница
    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-37649
3APA3A
2003-12-26 20:59
2004.01.13
StringGrid...


1-37701
DimaK
2003-12-24 22:50
2004.01.13
В чем моя ошибка?


7-37945
VitGun
2003-09-24 18:32
2004.01.13
LPT(378h или 379h)?


3-37578
ДмитрийБ
2003-12-13 18:45
2004.01.13
Не срабатывают запросы...


3-37543
Olga_Oo
2003-12-15 18:36
2004.01.13
SQL





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