Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка: не удается найти файл, при открытии файла 
V
    Опции темы
prophetz
Дата 14.7.2009, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 2.9.2007

Репутация: нет
Всего: нет



Собственно такая проблема. При открытии некоторого файла

Код

FS := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);


возникает ошибка: не удается открыть указанный файл.

Методом теста оказалось, что это из за символа 

Код

ä


в имени файла. Делфи у меня седьмой версии.

Как можно исправить данную ошибку? Использовать другие имена не возможно, т.к. вероятность существования таких имен файлов у других пользователей этой программы тоже присутствует.
PM MAIL   Вверх
Данкинг
Дата 14.7.2009, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



А программно переименовать можно? Или копию файла сделать под "нормальным" именем.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
prophetz
Дата 14.7.2009, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 2.9.2007

Репутация: нет
Всего: нет



Программа: создание каталога музыки по ID3

Т.е. она ищет все файлы из категории и читает ID3. Тут и выскакивает ошибка.

Если мы будем все такие файлы переимеименовывать юзеру не понравится.

Хотя тут сразу возникает вопрос: как отловить все такие имена файлов.

Имена хранятся в листбоксе.
PM MAIL   Вверх
Данкинг
Дата 14.7.2009, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Цитата(prophetz @  14.7.2009,  23:06 Найти цитируемый пост)
Т.е. она ищет все файлы из категории и читает ID3.

Хорошо, а зачем тогда через TFileStream?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
prophetz
Дата 14.7.2009, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 2.9.2007

Репутация: нет
Всего: нет



ну попробую прочитать по другому. просто именно с TFileStream взял готовую реализацию

Добавлено через 12 минут и 38 секунд
а с 

Код

AssignFile(F, fn);


все работает отлично. странно
PM MAIL   Вверх
CodeMonkey
Дата 14.7.2009, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Можно попробовать как:

Код
FS := TFileStream.Create(CreateFileW(PWideChar(FileName), ...), fmOpenRead or fmShareDenyWrite);


(проверка ошибок опущена)

Только FileName тоже должна быть unicode, а не Ansi. Ну и место, откуда она заполняется, - тоже.

Откуда файл на диске взялся? Может имя корректировать при формировании файла?


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Данкинг
Дата 14.7.2009, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Цитата(prophetz @  14.7.2009,  23:15 Найти цитируемый пост)
просто именно с TFileStream взял готовую реализацию 

Да, в DRKB именно так. smile А вот что я в DW нашёл (сам не тестил):

Код

type
  TMP3Tag = record
    FileName, Title, Artist, Album, Year, Comment: string;
  end;

function GetMP3Tag(fn: string): TMP3Tag;
var
  tag: array[0..127] of char;
  f: file;
  i: byte;
  s: string;

  procedure DelSpace(var s: string);
  begin // Удаляет пробелы и символы
    // #0 в конце строки.
    if length(s) = 0 then
      exit;
    while s[length(s)] in [' ', #0] do
    begin
      delete(s, length(s), 1);
      if s = '' then
        break;
    end;
  end;

begin
  result.FileName := fn;
  result.Title := '';
  result.Artist := '';
  result.Album := '';
  result.Year := '';
  result.Comment := '';

  AssignFile(F, fn); // Открываем файл
{$I-} // с проверкой его существования :)
  Reset(F, 1);
  Seek(F, FileSize(F) - 128); // Читаем тэг - последние 128 байт
  BlockRead(f, tag, 128);
  CloseFile(F);
{$I+}

  if IOResult <> 0 then
  begin
    exit;
  end;

  s := '';
  for i := 0 to 127 do
    s := s + tag[i];

  if copy(s, 1, 3) = 'TAG' then // В файле есть тэг - разбираем его
  begin
    result.Title := copy(s, 4, 30);
    DelSpace(result.title);
    result.Artist := copy(s, 34, 30);
    DelSpace(result.artist);
    result.Album := copy(s, 64, 30);
    DelSpace(result.album);
    result.Year := copy(s, 94, 4);
    DelSpace(result.year);
    result.Comment := copy(s, 98, 30);
    DelSpace(result.comment);
  end;
end;


Использование:
Код

var
  Tag: TMP3Tag;
begin
  if OpenDialog1.Execute then
    Tag := GetMP3Tag(OpenDialog1.FileName);
end;


Добавлено через 1 минуту и 43 секунды
Цитата(CodeMonkey @  14.7.2009,  23:28 Найти цитируемый пост)
Откуда файл на диске взялся? Может имя корректировать при формировании файла? 

Ну, видимо, файл скачан откуда-нибудь с торрента и имеет название на том языке, на котором поёт исполнитель. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
prophetz
Дата 15.7.2009, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 2.9.2007

Репутация: нет
Всего: нет



именно так и сделал, все работает
PM MAIL   Вверх
Sanek123
Дата 31.7.2009, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 22.10.2008

Репутация: нет
Всего: нет



http://forum.vingrad.ru/forum/act-ST/f-87/...6/unread-1.html - готовое решение. Запихнешь в цикл и будет счастье.
--------------------
Вас разыскивают бойцы 139-го порта...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1113 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.