Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

EInOutError - Invalide File Name [D4]


Страницы:   1 2

Германн ©   (2005-03-04 01:16:00) 

Возвращаюсь к более раннему моему топику. Нашел способ уточнить подробности сего исключения. И вижу, что имя файла - полностью нормальное! Никаких "запрещенных символов" не содержит.

Теперь вопрос. Если кто знает :(
Может ли эта ошибка(исключение) генерироваться из-за того, что ограничены права данного юзера на создание файла в некоей директории(папке)?
ОС точно не знаю. Но думаю, что это либо 2k, либо XP.


Германн   (2005-03-08 03:25:00) [1]

2 Palladin ©   (08.03.05 02:55) [31]

Ну и... ?
Вы привели часть опубликованного мной кода:
>Palladin ©   (08.03.05 02:13) [29]

>> Код совершенно обычный:
>>  AssignFile(FDest,SndName);
>>   {$I-}
>>  Reset(FDest,1);
>>   {$I+}
>>  if (IOResult <> 0) or (not Loop) then begin

Я, лично на TP3 не работал.
Имхо, врядли кто из участников сего форума на ТР3 смог поработать! Ну максимум Юрий Зотов и то врядли. В те времена в СССР просто не было компьютеров на которых можно было бы пользоваться ТР3, а если такие и были, то они были в распоряжении "солидных людей"!
Но в работах на TP4 уже принимал участие. А уж на TP5 мною сделано много.

А Опции компиллятора {$I-} и {$I+} созданы для того, чтобы имелась возможность "отключить стандартную реакцию" системы на ошибку ввода/вывода. Ранее это - сообщение системы об ошибке, сейчас это - возбуждение исключения (что вообщем-то одно и то же).


Palladin   (2005-03-08 02:55:00) [2]

Да в общем то оно очевидно как из определения, так и из документации (советую к прочтению F1, как знаете, еще из TP3 эта тема тянется). Как только IOResult принимает значение отличные от нуля вне границ {$I+} {$I-} возникает исключение. Для того {$I-} {$I+} и созданны вообще то...


Германн   (2005-03-08 02:42:00) [3]

2 Gero ©   (08.03.05 01:59) [28]
 Отвечу как только, так сразу :) Но ес-сно только после праздников.

2 Palladin ©   (08.03.05 02:13) [29]
>Во первых: IOResult считывается имеено в рамках {$I+} {$I-},
>вне, оно не имеет смысла.
Извини Тимур, но кто тебе сказал такую чушь?

Насчет "во-вторых" я уже говорил. Именно о том что оно стоит. А пока добавлены лишь весьма дешевые строки с записью в лог.


Palladin   (2005-03-08 02:13:00) [4]


> Код совершенно обычный:
>  AssignFile(FDest,SndName);
>   {$I-}
>  Reset(FDest,1);
>   {$I+}
>  if (IOResult <> 0) or (not Loop) then begin
>    FInspMain.SaveLog(nil,SndName,'TSndData.Create');
>    Rewrite(FDest,1);
>    Move(CWaveStruct,FDestHeader,SizeOf(TWaveStruct));
>    BlockWrite(FDest,FDestHeader,SizeOf(TWaveStruct));
>  end else begin
>    BlockRead(FDest,FDestHeader,SizeOf(TWaveStruct));
>    Seek(FDest,FileSize(FDest));
>  end;

Ничуть не обычный.

Во первых: IOResult считывается имеено в рамках {$I+} {$I-},
вне, оно не имеет смысла. Во вторых, его значение отнюдь не лишено смысла, и стоит его проанализировать прежде чем гадать, что же происходит.


Gero   (2005-03-08 01:59:00) [5]


> Германн ©   (08.03.05 01:55)

Так что с правами?
Какие NTFS-разрешения/запреты стоят?


Германн   (2005-03-08 01:55:00) [6]

2 Anatoly Podgoretsky ©   (07.03.05 11:20) [26]
>Тогда какого черты ты спрашиваешь, без изменения кода удачи не >видать. Приходи тогда, когда будет предложено.

Простите напомню:
Германн ©   (04.03.05 12:55) [5]
2 Anatoly Podgoretsky ©   (04.03.05 08:54) [4]
Этот код работает уже лет 8. И без проблем.

И это без обмана. Программа с этим кодом работает уже 8 лет. На разных объектах. И нигде такой проблемы не было!
Но! Как правило, до сих пор никто или почти никто не занимался "установкой прав юзеров".

Таки вот и задал я свой вопрос, потому что не понял из-за чего возникает ошибка EInOutError : Invalid File Name?
Потому что в в логе, имя файла совершенно нормальное!

Анатолий!
А Вы, когда постируете свои ответы всегда глядите лишь на последнее сообщение?Или иногда учитываете всю ветку?


Anatoly Podgoretsky   (2005-03-07 11:20:00) [7]

Тогда какого черты ты спрашиваешь, без изменения кода удачи не видать. Приходи тогда, когда будет предложено.


Германн   (2005-03-07 02:38:00) [8]

2 Anatoly Podgoretsky ©
2 Defunct ©
Мужики!

Приведенный код, я согласен, "ну очень "хреновый""!
Но, еще раз, - он не мой!А переделка сего кода требует "времязатрат" и, ес-но "доп.оплаты". Но мне такого не было предложено!

Таким образом, если сия проблема может быть решена "Какой-либо "установкой "Каких-либо прав юзеров"", то я буду "ну оченьрад!"

Пока, отключаюсь. Жду сообщений от юзеров с объекта. Результат сообщу.
Как только, так сразу :)


Defunct   (2005-03-06 20:55:00) [9]

Defunct ©   (06.03.05 02:43) [21]

Добавлю, токое исключение может возникнуть в случае, если файл с атрибутом Read-Only был открыт в блоке {$i-} Reset(F) {$i+}


Anatoly Podgoretsky   (2005-03-06 11:52:00) [10]

Все тоже самое, reset в проверке, а затем rewrite уже без проверки. Либо делается проверка на каждом шаге, или что лучше делается в защищенном блоке. А при такой реализации даже узнать где произошла ошибка не получится, даже отладка не поможет, нельзя читать IOResult в отладчике.
Надо просто переписать программу, а еще лучше вообще сменить алгоритм, ряд вариантов подсказали.

При этой реализации лог будет показывать температуру где то там.
Не используй  
{$I-}
Reset(FDest,1);
{$I+}

пиши с помощью защищенны[ блоков
AssignFile(FDest,SndName);
try
  Reset(FDest,1);
  ...
  ...
except
  Обработка ошибки
end;


Тоже если вздумаешь при ошибки перезаписывать файл.


Германн   (2005-03-06 02:59:00) [11]

2 Defunct ©   (06.03.05 02:43) [21]
Оно  где-то там.
Если это не так, то прошу меня расстрелять при первой возможности, и, плииз, максимально безболезненно. :)


Defunct   (2005-03-06 02:43:00) [12]

> А Вы можете указать на что-то "неправильное" в сообщении
> по поводу записей в логе?

Могу сказать, что исключение возникло либо на строке ReWrite(F) либо вообще не в этой процедуре, не более того.


Германн   (2005-03-06 02:03:00) [13]

2 Defunct ©   (05.03.05 04:10) [19]
>Меняйте на
>GuAV ©   (05.03.05 02:42) [14]
>> Самый удобный способ - через TMemoryStream.

>и больше этот вопрос Вас не будет волновать.

Поменяю, но не на вариант GuAV ©   (05.03.05 02:42) [14], а на тот, что я высказал в Германн ©   (05.03.05 01:53) [10].
Вот только найти бы того, кто это оплатит!

>или учитывая, что
>Германн ©   (05.03.05 01:03) [7]
>> Потому что файл, о котором идет тут речь - временный.
>Замените каталог временных файлов на более подходящий с всегда ?>разрешенными правами на создание и запись, пишем:

Именно это сейчас и делается! Т.е. люди на том объекте сейчас именно и обещали "разобраться с правами пользователей!" И навести в этом отношении порядок, если что не так!" Жду от них ответа в виде лог-файла!

А Вы можете указать на что-то "неправильное" в сообщении
Германн ©   (04.03.05 12:55) [5] по поводу записей в логе?


Defunct   (2005-03-05 04:10:00) [14]

Германн ©   (05.03.05 03:24) [18]
> Меня сейчас интересует только "EInOutEroor : Invalid filename"


Меняйте на
GuAV ©   (05.03.05 02:42) [14]
> Самый удобный способ - через TMemoryStream.


и больше этот вопрос Вас не будет волновать.

или учитывая, что
Германн ©   (05.03.05 01:03) [7]
> Потому что файл, о котором идет тут речь - временный.

Замените каталог временных файлов на более подходящий с всегда разрешенными правами на создание и запись, пишем:

function ValidateFileName( AFileName: String ):String;
var
  TempName   : PChar;
begin
  GetMem( TempName, 1024);
  try
     GetTempPath( 1024, TempName );
     Result := TempName + ExtractFileName(AFileName)
  finally
     FreeMem( TempName, 1024)
  end
end;


и

Германн ©   (04.03.05 12:55) [5]
> AssignFile(FDest, SndName );


Заменяем все SndName на ValidateFileName(SndName)

Вариант?


Германн   (2005-03-05 03:24:00) [15]

Да бог ним. С вариантом.
Меня сейчас интересует только "EInOutEroor : Invalid filename"
Как оно может возникнуть? и Как с ним бороться?
Жду сообщений с объекта.


Германн   (2005-03-05 03:09:00) [16]

2 GuAV ©   (05.03.05 02:55) [16]
В твоем варианте вполне может быть "сказано" так, что будет "воспринято" заказчиком или покупателем, как "основание для неплатежа" или как "основание еще чего-нибудь". Ведь вторая функция PlaySound выполнится БГ знает когда после выполнения первой функции PlaySound! А произношение "девяносто....................девять" - очень плохо звучит.


GuAV   (2005-03-05 02:55:00) [17]


> Германн ©   (05.03.05 2:46) [15]

Когда писал [13], [12] не видел, сори...

Хотя его легко до вида когда 90 и 9 будут произносится правильно.
PlaySound(IntToShr((N div 10)*10)+'.wav', 0, SND_SYNC or SND_FILENAME);
PlaySound(IntToShr((N mod 10))+'.wav', 0, SND_SYNC or SND_FILENAME);
если N равно 99 то будет сказано сначало 90.wav, а потом 9.wav.


Германн   (2005-03-05 02:46:00) [18]

Предлагаю всем желающим ознакомиться с вариантом GuAV ©   (05.03.05 02:39) [13]
Принять или не принять сей вариант - Ваше дело.
Я - пас. Поскольку мой сабж - не об этом!


GuAV   (2005-03-05 02:42:00) [19]

Германн ©   (05.03.05 2:37) [12]
Склеивание" в том числе преполагало и "склеивание" для "вразумительного" произношения числа "девяносто девять" файлов "90.wav" и "9.wav".


Всё равно не понятно зачем в файл клеить. Можно склеивать в памяти. Самый удобный способ - через TMemoryStream.


GuAV   (2005-03-05 02:39:00) [20]

Работоспособный пример, поясняющий идею с потоком. В ListBox1 несколько полных путей к WAV файлам.

uses MMSystem;

var ThdID: DWORD;

const
 WM_PLAY_ONCE   = WM_USER + 0;
 WM_PLAY_ADD    = WM_USER + 1;
 WM_PLAY_REMOVE = WM_USER + 2;
 WM_PLAY_QUIT   = WM_USER + 3;

function WaveThd(Parameter: Pointer): Integer;
var
 Msg: TMsg;
 L: TList;
 I: Integer;
 sounds: TStrings;
begin
 sounds := Parameter;
 L := Tlist.Create;
 while True do
   if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
     case Msg.message of
       WM_PLAY_ONCE:
         PlaySound(PChar(sounds[Msg.lParam]), 0, SND_SYNC or SND_FILENAME);
       WM_PLAY_ADD:
         L.Add(Pointer(Msg.lParam));
       WM_PLAY_REMOVE:
         L.Remove(Pointer(Msg.lParam));
       WM_PLAY_QUIT, WM_QUIT: Break;
     end
   else
     if L.Count = 0 then
     begin
       if not WaitMessage then Break
     end
     else
     begin
       for I := 0 to L.Count - 1 do
         PlaySound(PChar(sounds[Integer(L[I])]), 0, SND_SYNC or SND_FILENAME);
     end;
 Result := Msg.wParam;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 BeginThread(nil, 0, WaveThd, ListBox1.Items, 0, ThdID);
end;

// проиграть один раз выбранный в LisbBox1 файл
procedure TForm1.Button1Click(Sender: TObject);
begin
 PostThreadMessage(ThdID, WM_PLAY_ONCE, 0, ListBox1.ItemIndex);
end;

// поставить выбранный в LisbBox1 файл на постоянное воспроизведение
procedure TForm1.Button2Click(Sender: TObject);
begin
 PostThreadMessage(ThdID, WM_PLAY_ADD, 0, ListBox1.ItemIndex);
end;

// снять выбранный в LisbBox1 файл с постоянного воспроизведенич
procedure TForm1.Button3Click(Sender: TObject);
begin
 PostThreadMessage(ThdID, WM_PLAY_REMOVE, 0, ListBox1.ItemIndex);
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо