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