![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
EInOutError - Invalide File Name [D4]
Германн © (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]Может.