Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > ошибка 183 - если файл открыт в процедуре?


Автор: vl1639 16.1.2009, 20:49
Открываю файл для записи в основной программе, - все вроде нормально. Чтоб разгрузить программу - выношу в одну из процедур присоединение и открытие файла, и запись в него и - на операторе ReWrite(f) - вылезает ошибка "I/O error 183" и программа стопорится. Года два назад я уже наступал на эти грабли и мне что- то здесь посоветовали, но я так редко программирую, что не записавши,  все позабыл. Помогите советом и простите за бестолковость. Наверное что-то элементарное упускаю.

Автор: hkdkest 17.1.2009, 00:39
Может ты два раза Rewrite используешь, т.е. когда файл занят

Автор: Christoph 17.1.2009, 01:40
Покажи код

Автор: Данкинг 17.1.2009, 02:10
Глюк с открытием файла какой-то. Без кода действительно ничего не понять. smile 

Автор: vl1639 17.1.2009, 13:07
Вот, я попробовал выделить отдельно обращение к процедуре, в которой надо записать файл в  другую папку 
Код

unit newmain;
interface
uses
  Windows,newunit, Forms, Classes, Controls, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormActivate(Sender: TObject);
begin
  GetDir(0,mydir);
  newdir:=mydir+'\dop';
  MkDir(newdir);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 myproc;
end;
end.
=================================
unit newunit;
interface
Var
 mydir,newdir :string;
Procedure myproc;
implementation
Procedure myproc;
var ff:TextFile;
begin
 ChDir(newdir);
 Assign(ff,'11.txt');
 ReWrite(ff);
   WriteLn('Hello');
 CloseFile(ff);
 ChDir(mydir);
end;
end.

Автор: Rrader 17.1.2009, 13:23
vl1639, 183 ошибка означает следующее:
Цитата

Невозможно создать файл, так как он уже существует

Работаешь паскалевским методом - сделай проверку, есть ли уже такая директория, вроде такой:
Код

procedure TForm1.FormActivate(Sender: TObject);
begin
  GetDir(0, MyDir);
  NewDir := MyDir + '\dop';
  if not DirectoryExists(NewDir) then
    MkDir(NewDir);
end;

И еще:
Цитата

WriteLn('Hello');

файл забыл:
Код

WriteLn(ff, 'Hello');

Автор: vl1639 17.1.2009, 17:22
to Rrader:
1.В этом примере ошибка исчезла. Посмотрю попозже в полном коде, где такого типа операций поболее.
Я знал, что означает ошибка 183, и знал, что файла не существовало к моменту создания. Но почему ошибка вылезала на операции с файлом, а не с директорией? (а WriteLn(ff, 'Hello') - это просто описка в сообщении) 
2.А непаскалевским методом как бы это выглядело, если нетрудно - поясни? 

Автор: Rrader 17.1.2009, 17:37
Цитата(vl1639 @  17.1.2009,  23:22 Найти цитируемый пост)
2.А непаскалевским методом как бы это выглядело, если нетрудно - поясни? 

Тут по-разному можно, через список можно, через потоки можно.
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  Path: String;
begin
  Path := ExtractFilePath(ParamStr(0)) + 'dpo' + PathDelim;
  ForceDirectories(Path);
  SetCurrentDirectory(PChar(Path));
  with TStringList.Create do
  try
    Append('Hello');    
    SaveToFile('11.txt');
  finally
    Free;
  end;
end;


Добавлено @ 17:38
Цитата(vl1639 @  17.1.2009,  23:22 Найти цитируемый пост)
Но почему ошибка вылезала на операции с файлом, а не с директорией?

В приведенном коде эта ошибка вываливалась на MkDir(NewDir); остальное все в норме...

Автор: vl1639 19.1.2009, 08:31
To Rrader 
1.Спасибо за пример. Почитал про процедуры и функции из этого класса- для моих задач, похоже, 
ничего не упрощается и функционально не расширяется. 
2.Кажется тему надо закрыть, но все же почему ошибка I/O вылезает у меня на ReWrite, хотя исключение 
формировалось на MkDir. У меня в реальной программе между этими операторами десятки других и 
обращения к процедурам(но все не из класса I/O). Это смущает. Может у меня в Delphi6 чего-то 
недоставлено? Помнится, давно еще, когда я устанавливал, я для экономии места много чего поотменял. 
Может чего-то доставить?  

Автор: Rrader 19.1.2009, 08:39
Цитата(vl1639 @  19.1.2009,  14:31 Найти цитируемый пост)
2.Кажется тему надо закрыть, но все же почему ошибка I/O вылезает у меня на ReWrite, хотя исключение формировалось на MkDir.

Нужен весь код, тогда можно будет говорить о причине.
Цитата(vl1639 @  19.1.2009,  14:31 Найти цитируемый пост)
 У меня в реальной программе между этими операторами десятки других и обращения к процедурам(но все не из класса I/O).

Вот-вот smile 
Цитата(vl1639 @  19.1.2009,  14:31 Найти цитируемый пост)
Может у меня в Delphi6 чего-то недоставлено? Помнится, давно еще, когда я устанавливал, я для экономии места много чего поотменял. Может чего-то доставить?  

RTL ты не исключишь. Все в норме.

Автор: vl1639 19.1.2009, 23:53
Цитата Rrader    Дата 17.1.2009, 17:37  
Цитата

В приведенном коде эта ошибка вываливалась на MkDir(NewDir); остальное все в норме...


В приведенном сокращенном коде останов с сообщением об ошибке у меня стабильно возникает в процедуре с полосой на ReWrite  (при наличии создаваемой поддиректории и отсутствии в ней открываемого файла). А в полной программе было то же самое и это запутывало.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)