Форум: "Основная";
Текущий архив: 2002.10.17;
Скачать: [xml.tar.bz2];
ВнизI/O error 183 Найти похожие ветки
← →
Zemal (2002-10-08 15:00) [0]
try
...
AssignFile(LogFile,ChangeFileExt(Application.ExeName,".log"));
if FileExists(ChangeFileExt(Application.ExeName,".log"))
then Append(LogFile)
else Rewrite(LogFile);
Writeln(LogFile,"Message : Startup dounload.");
CloseFile(LogFile);
... // основной код (около минуты работы процесса)
AssignFile(LogFile, ChangeFileExt(Application.ExeName,".log"));
if FileExists(ChangeFileExt(Application.ExeName,".log"))
then Append(LogFile) //точка возникновения ошибки
else Rewrite(LogFile);
Writeln(LogFile,"Message : Dounload succesfully.");
CloseFile(LogFile);
...
except
on E: Exception do
begin
AssignFile(ErrFile,ChangeFileExt(Application.ExeName,".err"));
if FileExists(ChangeFileExt(Application.ExeName, ".err"))
then Append(ErrFile)
else Rewrite(ErrFile);
ClassThree := E.ClassName;
MyClassRef := E.ClassType;
while MyClassRef.ClassParent <> nil do
begin
MyClassRef := MyClassRef.ClassParent;
ClassThree := MyClassRef.ClassName + " => " + ClassThree;
end;
Writeln(ErrFile, "ClassThree : " + ClassThree);
Writeln(ErrFile, "Message : " + E.Message);
Writeln(ErrFile, "PointError : " + IntToStr(PointError));
CloseFile(ErrFile);
end;
end;
Проблема:
----------------------------
ClassThree : TObject => Exception => EInOutError
Message : I/O error 183
----------------------------
(это нахожу в логе ошибок)
Почему-то первый раз всё проскакивает и сервис мой работает как надо... закачивает файлы с FTP и пишет логи, а вот при втором и последующих срабатываниях выскакивает ошибка I/O error 183. Все хелпаки перерыл... нифига... :( MSDN у меня тут пока нет (всё никак на развал не дойду). Посмотрите, плиз, кто-нибудь что это за фигня!!! Заранее огромное спасибо!
P.S. Чуть не забыл пояснить :). Приведённый код находится в теле процесса (или потока... кому как нравится). Поток в принципе один и не пересекается (записью в файл) с другими потоками. Уже всю голову изломал. И самое главное: почему после перезагрузки один раз поток работает без ошибок, а потом хоть тресни... :(.
P.P.S. В коде есть коментарий в каком месте всегда возникает ошибка (Append(...)).
← →
AlexT1000 (2002-10-08 15:13) [1]windows.pas
шукати треба вмиты
{ Cannot create a file when that file already exists. }
ERROR_ALREADY_EXISTS = 183;
может у тебя с атрибутами файла доступ и все такое чего то не то
← →
han_malign (2002-10-08 15:17) [2]В общем то тоже самое
procedure Log(FName, S : String);
var fh : THandle; bw : LongWord;
begin
S:=S+#13#10;
fh := CreateFile(FName, GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if fh <> INVALID_HANDLE_VALUE then begin
SetFilePointer(fh, 0, nil, FILE_END);
WriteFile(fh, S[1], Length(S), bw, nil);
CloseHandle(fh);
end;
end;
но в одном потоке у меня не падало, а вот в двух с завидной постоянностью.
В чем дело сам не пойму. Похоже какой-то глюк от MS с буферизацией или кешированием(кстати надо попробовать FILE_FLAG_WRITE_THROUGH).
← →
Zemal (2002-10-08 15:26) [3]>> AlexT1000
Файл-то перезаписывается, если его нет, а затем дописывается... в принципе первая запись в файл срабатывает всегда (и в существующий и в созданный заново), а вторая запись вызывает ошибку... никак непойму... ведь код совершенно одинаковый!!! Самое смешное, что возникает ошибка во второй части и, скорее всего, её вызывает Append(). Почему? Никак не допру...
← →
Zemal (2002-10-08 15:33) [4]>> han_malign
Я знаю что можно и через "хандл" файла... могу и в файловый поток организовать и писать туда... а ещё проще и по приколу то, что в лог-файл всё пишется (!!!) и без ошибок, если поставить {$I-}...{$I+}. Просто я этого не хочу делать... мне надо разобраться в чём проблема... кстати через хандл тоже могут быть проблемы такого же плана...
← →
Zemal (2002-10-08 15:41) [5]А может быть из-за прав доступа это? Хотя... причём тут это, когда сервис создаёт сам файл и потом его юзает... только одного не пойму: почему после перезагрузки виндов один раз сервис срабатывает правильно и без ошибок... а при повторном запуске потока возникает эта ошибка... хз :(. На другом сервере такая же каша... уже тестировал... первый раз правильно, потом перезапускаешь сервис и понеслось... :( шаманство какое-то... одно и тоже под NT 4.0sp6 и 2000sp2... один хрен.
← →
Zemal (2002-10-08 15:50) [6]Кароче... надоело... сделаю потоком в файл, а там винда сама разберётся... спасибо всем за советы...
← →
han_malign (2002-10-08 15:54) [7]кстати через хандл тоже могут быть проблемы такого же плана...
Ага, только в двух потоках у меня не ошибка, а мертвый Hung up.
А в Append делается CreateFile(Filename,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0), плюс поиск Ctrl+Z в последних 128 байтах (assign.asm).
Перекомпились с RTL(или debud DCU) и попробуй отладится по asm-у.
← →
AlexT1000 (2002-10-08 16:07) [8]может тебе через хендлы сделать и в после закртия файла устанавливать его дату
Source: Integer; { handles }
Source := FileOpen(FileName, fmShareDenyWrite);
...
FileClose(Source);
FileSetDate(Source,DateTimeToFileDate(Now));
← →
REA (2002-10-08 17:51) [9]А если файл открывать в основном потоке и только Handle использовать с критической секцией, чтобы потоки не подрались?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.10.17;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c