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-05 02:37:00) [21]

2GuAV ©   (05.03.05 02:02) [11]
>То что никакого "сбора" бы не было. Проигрываете один, затем другой, в перерывах проверяеете не изменился ли "плейлист".

Я, конечно не прав, что не изложил полностью идеологию данной функции. Данная функция формирует Wav-файл, в который включен "номер датчика" в диапазоне от 1 до 99.
"Склеивание" в том числе преполагало и "склеивание" для "вразумительного" произношения числа "девяносто девять" файлов "90.wav" и "9.wav".


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

Германн ©   (05.03.05 1:53) [10]
Эт-да, да вот только разница будет, "если файл уже есть в памяти", а если его ещё нужно "собрать из кусочков"?


Так можете собирать в памяти, заменив например BlockWrite на TMemoryStream.Write

Германн ©   (05.03.05 1:53) [10]
А что бы это изменило? Причем тут "отдельный поток"? Мне вроде как и основного хватало?

То что никакого "сбора" бы не было. Проигрываете один, затем другой, в перерывах проверяеете не изменился ли "плейлист". Я бы так попробовал бы перед тем как "склеивать". В прочем учитывая [10] это отпадает.


Германн   (2005-03-05 01:53:00) [23]

2 GuAV ©   (05.03.05 01:31) [8]
Если бы это писАл я, да еще сейчас, а не 10 лет назад, я бы вообще пошел бы другим путем. Например, использовал бы что-то из SpeechAPI. Гораздо удобнее, чем WAV-файлы.
Но кто мне это оплатит?

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

Но, кстати.
>А почему бы не проигрывать их ("кусочки") синхронно в отдельном потоке, а имена или IDы их передавать через postmessage ?
А что бы это изменило? Причем тут "отдельный поток"? Мне вроде как и основного хватало?

>Или собирать их из "кусочков" в памяти ? (у PlaySound / sndPlaySound есть флаг SND_MEMORY)
Эт-да, да вот только разница будет, "если файл уже есть в памяти", а если его ещё нужно "собрать из кусочков"?


GuAV   (2005-03-05 01:43:00) [24]


> потоке, а имена или IDы их передавать через
> postmessage ?

т.е. PostThreadMessage. выбирать их PeekMessage с pm_remove, если нечего проигрывать ждать WaitMessage


GuAV   (2005-03-05 01:31:00) [25]

Германн ©   (05.03.05 1:03) [7]

>  Точнее - это WAV-файл который "собирается по
> кусочкам" из других, уже имеющихся


А почему бы не проигрывать их ("кусочки") синхронно в отдельном потоке, а имена или IDы их передавать через postmessage ?

Или собирать их из "кусочков" в памяти ? (у PlaySound / sndPlaySound есть флаг SND_MEMORY)


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

2 Anatoly Podgoretsky ©   (04.03.05 13:21) [6]
Код не мой. Код был написан другим человеком где-то в 95-96 годах. Еще на Д1. Позже он был портирован сначала на Д3 потом, может быть был изменен для Д4. И только два дня назад его(исходник) "вытрясли" из разработчика для того, чтобы выяснить причину ошибки EInOutError : Invalid filename.
Для этого во все места, где происходила работа с файлами, тем или иным способом, был вставлен вызов функции SaveLog. Её код:

procedure TFInspMain.SaveLog(E: Exception; EStr, PlaceSt: String);  
var
 i : Integer;
 FT : TextFile;
 St : String;
begin
 St:=ChangeFileExt(Application.ExeName,'.'+FormatDateTime('yymm',Now)+'.log.txt');
 AssignFile(FT,St);
 if FileExists(St) then Append(FT) else ReWrite(FT);
 if E <> nil then begin
   St:=DateTimeToStr(Now)+'-'+ E.ClassName+' : '+E.Message;
   Writeln(FT,St);
   //LogMemo.Lines.Add(St);
   if (E is EDBEngineError) then begin
     for i:=0 to EDBEngineError(E).ErrorCount-1 do begin
       St:=IntToStr(i)+': '+EDBEngineError(E).Errors[i].Message;
       Writeln(FT,St);
       //LogMemo.Lines.Add(St);
       St:='ErrorCode='+IntToStr(EDBEngineError(E).Errors[i].ErrorCode)+
         '  Category='+IntToStr(EDBEngineError(E).Errors[i].Category)+
         '  SubCode='+IntToStr(EDBEngineError(E).Errors[i].SubCode);
       Writeln(FT,St);
       //LogMemo.Lines.Add(St);
     end;
     if EDBEngineError(E).Errors[0].ErrorCode = DBIERR_INDEXOUTOFDATE then begin
       St:=EDBEngineError(E).Errors[1].Message;
       St:=Copy(St,Pos('Table:',St)+8,Length(St));
       St:=ExtractFileName(St);
       if Pos('.',St) <> 0 then St:=Copy(St,1,Pos('.',St)-1);
       CheckTbl(St);
     end;
   end;
   if EStr <> '' then Writeln(FT,EStr);
   if PlaceSt <> '' then Writeln(FT,PlaceSt);
 end else begin
   if EStr <> '' then begin
     St:=DateTimeToStr(Now)+'-'+EStr;
     Writeln(FT,St);
     if PlaceSt <> '' then Writeln(FT,PlaceSt);
   end else if PlaceSt <> '' then begin
     St:=DateTimeToStr(Now)+'-'+PlaceSt;
     Writeln(FT,St);
   end;
 end;
 Writeln(FT,'*****************************************************************');
 CloseFile(FT);
end;


Код обработчика:
procedure TFInspMain.AppEvents1Exception(Sender: TObject; E: Exception);
begin
 SaveLog(E,'','');
end;

>Почему после ошибки открытия делаются попытки записи?
Потому что файл, о котором идет тут речь - временный. Создаваемый программой тогда, когда это нужно. Точнее - это WAV-файл который "собирается по кусочкам" из других, уже имеющихся, WAV-файлов, для озвучиванияпроизошедшего в системе события. Но! События могут быть двух типов: ординарные и особенные. В первом случае их достаточно озвучить однократно и затем замолчать. Во втором - их надо постоянно повторять до тех пор, пока ситуация не исправится или оператор не нажмет специльную кнопку, подтверждая, что он тревогу принял и осознал. В этом втором случае файл уже может существовать, если предыдущая тревога еще не снята. И тогда новое сообщение прибавляется к старому. Во всех остальных случаях файл, по умолчанию" не существует, поскольку его имя - содержимое автоикрементного поля DB.


Anatoly Podgoretsky   (2005-03-04 13:21:00) [27]

И где код обработчика, где код SaveLog?
Почему после ошибки открытия делаются попытки записи?
Почему не используется более совершенная технология исключений, а вместо ее устаревшая из ДОС и та не правильно используется.

Не надо пока ни какие права проверять, надо сначала привести код программы.


Германн   (2005-03-04 12:55:00) [28]

2 Anatoly Podgoretsky ©   (04.03.05 08:54) [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;

Этот код работает уже лет 8. И без проблем.
А вот теперь на одном объекте:
03.03.2005 12:59:29-C:\INSPECT\SOUND\TEMP\1314.WAV
03.03.2005 12:59:29-EInOutError : Invalid filename
**************************************************
Первая строка записана в лог функцией SaveLog. Вторая записана в обработчике Application.OnException.
Сегодня обещали на том объекте проверить все права.


Anatoly Podgoretsky   (2005-03-04 08:54:00) [29]

Германн ©   (04.03.05 01:16)  
Это означает, что не смогло работать с таким именем, а конкретная причина неизвестна, в том числе и права. Проверяется через проводник и проверяется дважды в той папке и папке где гарантированы права. Еще может мешать антивирус и другие подобные бяки.
А что за код?


Gero   (2005-03-04 08:33:00) [30]


> Германн ©   (04.03.05 01:25)

Тем не менее, оно может генерироваться и не из-за этого.


Германн   (2005-03-04 01:25:00) [31]

2 Gero ©   (04.03.05 01:19) [1]

Вы уверены?
Тогда Спасибо!


Gero   (2005-03-04 01:19:00) [32]

Может.


Страницы:   1 2

Наверх

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