Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.09;
Скачать: CL | DM;

Вниз

Странное поведение AssignFile( ) - короче не работает, а почему?   Найти похожие ветки 

 
Сергей   (2002-12-25 20:39) [0]

Вводные такие
Delphi 6, win 98.

Процедура записи в файл
.......
var
F : TextFile;
S : String;
begin
S := "C:\temp\test.txt";
AssignFile(F,S);
// прокатывает
Rewrite(F); // I/O error "File not found"

Вызов идет из процедуры класса формы, которая создается в run time (т.е. ее копия не создается при запуске программы).

Процедура FileOpen и FileCreate работают здесь нормально.
Если я выдираю упомянутую форму из проекта и тестирую ее как отдельное приложение с созданием копии класса при запуске - все нормально.
Где же я мудак? - т.е. как правильно вызвать AssignFile (ну очень хочется иметь интерфейс текстового файла в етом месте).

Ответы плз, пишите на мыло, так как в инете бываю редко.
Спас.


 
Rouse_ ©   (2002-12-25 20:45) [1]

Ошибка не здесь, где-то в другом месте

Желаю успехов


 
Сергей   (2002-12-25 20:52) [2]

Да, забыл добавить, что F - локальная переменная.
Какой еще может быть вариант?
Допустим ли такое код?
var
T1 : TextFile;

imlementation

proc 1
begin

AssignFile(T1, "C:\test1.txt");
Rewrite(T1);
end;

proc 2
T2 : TextFile;
begin
AssignFile(T2, "C:\test2.txt");
Rewrite(T2);
//будет ли тут возникать ошибка
end;

Может ето мой случай?


 
Morfein ©   (2002-12-25 21:03) [3]

А может у тебя действительно файла нету? %))
А если есть, то зачем ты привязался к этому методу?... Чё, WinAPI теперь не в моде?
CreateFile или открывает иили создаёт файл, или тестирует его наличие... быстро, выгодно, удобно!


 
Сергей   (2002-12-25 21:07) [4]

Дык, сделать то все можно, только это вопрос времени (сколько его уйдет на хелпы по API, c учетом того, что пользую я его весьма ограничено). И ваще, вопрос принципиальный... Глюк ето неописанный или я дурак (второе конечно вероятней)


 
Rouse_ ©   (2002-12-25 21:15) [5]

> Morfein © (25.12.02 21:03)
А какая разница есть или нет? Автор указал что у него Rewrite, здесь до балды, если нет то он сам создасться

> Сергей (25.12.02 20:52)
Код работоспособный

Желаю успехов


 
Morfein ©   (2002-12-25 21:16) [6]

Ты не ответил, есть ли у тебя файл... А вообще, пришли прогу на мыло... мож чего скажу


 
Сергей   (2002-12-25 21:27) [7]

файла нет. Он должен создаваться после вызова Rewrite. Указанный путь существует. А прогу целиком слать - мазы нет, так много кб Ж)


 
Morfein ©   (2002-12-25 21:30) [8]

Ну как знаешь %))


 
Anatoly Podgoretsky ©   (2002-12-25 21:30) [9]

Ты пишешь "Если я выдираю упомянутую форму из проекта и тестирую ее как отдельное приложение с созданием копии класса при запуске - все нормально." - это говорит о том, что проблема у тебя в другом месте.
Возможно переопределен AssignFile мли Rewrite


 
gsu ©   (2002-12-25 21:32) [10]

var
F : TextFile;
S : String;
begin
S := "C:\temp\test.txt";
AssignFile(F,S);
Rewrite(F);
CloseFile(f);
end;

Наверняка, все работает, скорее нет прав на создание файла ?


 
Сергей   (2002-12-25 21:39) [11]

2 gsu > Дело не в правах. Под 98 я могу писать куда угодно - ето раз. Во вторых FileCreate работает.

2 Anatoly Podgoretsky > эти процедуры я не переопределял, первое что я проверил - нет ли процедур с такими именами в проекте - НЕТ.


 
gsu ©   (2002-12-25 21:44) [12]

Ах, да 98, сорри, но если все так:

Процедура записи в файл
.......
var
F : TextFile;
S : String;
begin
S := "C:\temp\test.txt";
AssignFile(F,S);
// прокатывает
Rewrite(F); // I/O error "File not found"

то мне самому интересно, потому как у мя работает, вот



 
Anatoly Podgoretsky ©   (2002-12-25 21:44) [13]

Это могут быть постороннии компоненты, попробуй обращаться так

System.AssignFile
System.Rewrite

Чудес же не бывает.


 
Anatoly Podgoretsky ©   (2002-12-25 21:45) [14]

Кроме того попробуй создать файл "C:\temp\test.txt" из проводника


 
gsu ©   (2002-12-25 21:46) [15]

>> Anatoly Podgoretsky © (25.12.02 21:44)
>> Чудес же не бывает.
Бывают, но не в математике


 
Сергей   (2002-12-25 21:51) [16]

2 gsu> А форму ты откуда создаешь?
Проверь еще так

Форма 1 создается в самом начале.
Application.CreateForm(Form1, TForm1);
Application.Run;

TForm1 = class(TForm)
.......
proc CreateForm2;
end;

TForm2 = class(TForm)
.......
proc Save;
end;

var
Form1 : TForm1;

proc Form1.CreateForm2;
var
F2 : TForm2;
begin
F2 := TForm2.Create(Self);
end;

proc Form2.Save;
var
F : TextFile;
S : String;
begin
S := "C:\temp\test.txt";
AssignFile(F,S);
Rewrite(F);
CloseFile(F);
end;

А так прокатывает?


 
Сергей   (2002-12-25 21:54) [17]

Файл тестовый из проводника создается. system.pas на диске в единственном экземпляре, и обращение напрямую system.rewrite не помогает :( Ето все я уже долбал.


 
Anatoly Podgoretsky ©   (2002-12-25 21:57) [18]

Ты проверил

System.AssignFile
System.Rewrite

Если проверил какой результат?


 
Сергей   (2002-12-25 21:59) [19]

Результат тот же. Может Дельфа мусором поросла? Я тут недавно компоненты смотрел, модет они напоганили чего? Переинсталить ее...


 
Anatoly Podgoretsky ©   (2002-12-25 22:01) [20]

Да и system.pas не интересует, интеренсует только system.dcu


 
Сергей   (2002-12-25 22:04) [21]

system.dcu в единственном экземпляре. А что там - только дельфи знает :) Бэкапов вроде не наблюдается.


 
Сергей   (2002-12-25 22:07) [22]

2 Anatoly Podgoretsky> Вся ета эпопея станет украшением fido7.ru.delphi.chainik :)


 
Song ©   (2002-12-25 23:24) [23]

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


 
PVOzerski ©   (2002-12-26 00:17) [24]

IMHO, либо ошибка совсем нелепая (например, нет на самом деле каталога c:\temp), либо
где-то происходит несанкционированное перекрытие строковой или файловой переменной
с "забиванием" его содержимого из-за некоррекной работы с индексами, динамической
памятью и т.п. или даже глюка компилятора. Попробуйте-ка посмотреть содержимое
файловой переменной в момент rewrite - то ли там имя. Внутреннее представление
структуры поищите в исходниках RTL, наверняка можно обойтись приведением
типов (во FreePascal есть TextRec и FileRec, наверняка подобное есть и в Delphi).


 
icWasya ©   (2002-12-26 10:23) [25]

а втом примере что приведён нет CoseFile


 
gsu ©   (2002-12-26 10:28) [26]

Да, да может понаоткрывал, а не закрывал и комп обиделся, грузанись.
А на счет в какой ты форме открываешь, это по фигу, если она создана и работоспособна


 
Anatoly Podgoretsky ©   (2002-12-26 10:38) [27]

Во всяком случае придено недостаточно информации, причина ошибки в неприведенном коде, на это также указывает следующее:

Если я выдираю упомянутую форму из проекта и тестирую ее как отдельное приложение с созданием копии класса при запуске - все нормально.


 
gsu ©   (2002-12-26 10:50) [28]

угу, все хренова оптимизация


 
Каспер ©   (2002-12-26 11:04) [29]

Все таки интересно чем это закончится.
Мне так интитивно кажется что файл уже занят чем то.
Давай выведи на экран IOResult... предварительно отрубив {$I-}...


 
Song ©   (2002-12-26 11:21) [30]

Я уже сказал в чём проблема..


 
Каспер ©   (2002-12-26 11:26) [31]

Так все решилось? И все таки интересно что выдал ИОРезулт


 
Сергей   (2002-12-26 13:08) [32]

Ничего не решилось. Все еще интьересней. Assign, Rewrite и CloseFile везде ходят парами. Из некоторых классов форм Assign работает, из некоторых нет - сл-но дело не в забытии закрыть файл.

PVOzerski >> либо
где-то происходит несанкционированное перекрытие строковой или файловой переменной
с "забиванием" его содержимого из-за некоррекной работы с индексами, динамической
памятью и т.п. или даже глюка компилятора.

Скорее всего так, но сроки жмут (2 дня осталось). Посему все кончилось прозаически - TStringList.SaveToFile("path");

Спасибо всем!


 
Каспер ©   (2002-12-26 14:04) [33]

:) Сорри Но точно там стоит AssignFile а не Assign?


 
Жорик   (2002-12-26 14:19) [34]

Попробуй такую связку:

var f: system.text;
//
assignfile(f,"c:\temp.text");
rewrite(f);

...

closefile(f);

Должно работать, по крайней мере у меня работает...



 
gsu ©   (2002-12-26 16:03) [35]

>> TStringList.SaveToFile("path")
героическое решение ...


 
Alexander1966   (2002-12-27 15:28) [36]

А диск точно c: СИ, может c: ЭС. Бывает.



Страницы: 1 вся ветка

Текущий архив: 2003.01.09;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.029 c
1-24837
Паша
2002-12-25 14:49
2003.01.09
AccessViolation - на ровном месте. Помогите, кто знает!


7-25123
Iogan
2002-10-29 16:10
2003.01.09
Как выдать через модем звуковой файл в телефонную линию


6-24994
Maestro77
2002-11-11 11:36
2003.01.09
Кликнуть по копке во фрейме.... оплачиваемая.


3-24812
alex_dorin
2002-12-17 09:29
2003.01.09
формат отображения в DBGrid


1-24836
race1
2002-12-27 11:44
2003.01.09
Косяк