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


Автор: CynicRus 14.6.2012, 15:53
Приветствую, господа. Задача тривиальна, прочитать файл. Читаю:
Код

procedure TForm1.GetParams;
begin
if  fileexists('rsc.prm') then
Params.LoadFromFile('rsc.prm');
end;

И файл не находится, хотя лежит в каталоге рядом с программой! Что я не так делаю?

Автор: Qu1nt 14.6.2012, 15:58
Задавай абсолютный путь.

Автор: CynicRus 14.6.2012, 16:05
Спасибо, понял. Обошелся помощью 
Код

ExtractFilePath(Application.ExeName)+'rsc.prm'


Автор: CynicRus 14.6.2012, 16:23
Ан нет, не обошелся. Показывает мне полный путь к файлу, и говорит мол - файл не найден. Хотя он на месте там лежит.

Автор: XperT 14.6.2012, 17:45
А если в showmessage закинуть, что пишет, правильный путь?
Просто обычно так не бывает, что проводник файл видит, а программа нет.

А вообще, кинули бы вы исходник проекта.

Автор: CynicRus 14.6.2012, 18:40
http://rghost.ru/38663251 Да, путь правильный пишет. Я понимаю, что обычно не бывает-))) Честно говоря - у самого подобное впервые-)

Автор: XperT 14.6.2012, 19:38
Вот эта функция:
Код

procedure TForm1.GetParams;
begin
TSTringList.Create;
if fileexists(ExtractFilePath(Application.ExeName)+'rsc.prm') then
Params.LoadFromFile(ExtractFilePath(Application.ExeName)+'rsc.prm');
end;


Как минимум правильно делать так:
Код

procedure TForm1.GetParams;
begin
Params := TSTringList.Create;
if fileexists(ExtractFilePath(Application.ExeName)+'rsc.prm') then
Params.LoadFromFile(ExtractFilePath(Application.ExeName)+'rsc.prm');
end;


Но лучше так не делать smile 
Вам абсолютно не нужно делать глобальные переменные, тем более такие как Params. Это классическая локальная переменная: создаете когда нужно  загрузить содержимое файла и проанализировать его, а в конце работы функции освобождаете память.

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

Автор: Данкинг 14.6.2012, 19:45
А разве слеш перед rsc.prm не надо?

Автор: CynicRus 14.6.2012, 19:46
На то он и учебный код-) Но тем не менее - файл то он почему не находит?-)) В первоначальном варианте - и было все с локальной переменной. Просто, как в любом тестовом проекте - пробуются разные варианты, потому вот такая хрень и получается-))) Спасибо, поправлю-) Но вопрос то остаётся, почему файл то не грузится, хотя путь верный?-)

Добавлено через 4 минуты и 8 секунд
Цитата(Данкинг @ 14.6.2012,  19:45)
А разве слеш перед rsc.prm не надо?

Без слеша показывает правильный путь, со слешем...тоже правильный показывает. Но тем не менее - очень ругается что файл найти ему не под силу.

Автор: Keeper89 14.6.2012, 19:59
Данкинг, ExtractFilePath со слешем возвращает.

Добавлено через 1 минуту и 12 секунд
CynicRus, окно отладчика с значениями переменных и наличием файла в проводнике приведи плиз.

Автор: CynicRus 14.6.2012, 20:13
user posted image

Автор: Qu1nt 14.6.2012, 20:23
Вероятно, в имени файла используется русская буква «c».

Автор: CynicRus 14.6.2012, 20:27
Цитата(Qu1nt @ 14.6.2012,  20:23)
Вероятно, в имени файла используется русская буква «c».

Ё-моё. А действительно. Ума не приложу - каким образом,так получилось, но Вы правы. Спасибо

Автор: Данкинг 14.6.2012, 20:42
Цитата(Keeper89 @  14.6.2012,  20:59 Найти цитируемый пост)
ExtractFilePath со слешем возвращает.

Разве? А я всегда слеш ставлю. smile 

Автор: Qu1nt 14.6.2012, 21:05
Данкинг, гораздо удобнее использовать класс TPath.
Код

TPath.Combine(TPath.GetDirectoryName(Application.ExeName), 'Read.me');

Автор: northener 14.6.2012, 21:10
Цитата(Данкинг @  14.6.2012,  20:42 Найти цитируемый пост)
Разве? А я всегда слеш ставлю.

Значим вам больше нравится функция ExtractFileDir smile

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