Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2009, 13:50   #1
Oburec
Пользователь
 
Регистрация: 20.03.2009
Сообщений: 33
По умолчанию Работа с относительными путями

Есть вьювер 3дсцены. при закрытии происходит сохранение настроек в файл путь к которому прописан как относительный .\someFolder\SomeFile.cfg
Все нормально работает в случае если в процессе работы приложения не происходило сохранение сцены в файл. Если сохранение вызывалось, то функция fileExists(.\someFolder\SomeFile.cf g) возвращает false, хотя файл на месте.
Есть подозрение, что если вызывалось сохранение в какой либо файл, то текущим (.\) становится тот каталог куда сохранил.
Вопрос: как определить куда ссылается вот такой путь .\?
Oburec вне форума Ответить с цитированием
Старый 11.04.2009, 15:14   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

попробуй делать так:
Код:
filePath:=ExtractFilePath(application.ExeName)+<твой путь>
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.04.2009, 16:44   #3
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Цитата:
Вопрос: как определить куда ссылается вот такой путь .\?
.\ - ошибка. Правильно так : ..\ - в пути к файлу или папке означает, что он на один уровень вверх в иерархии каталогов, т.е. выражение 'someFolder\SomeFile.cfg' будет означать что каталог someFolder и его содержимое находится в одном каталоге с твоей программой, а '..\someFolder\SomeFile.cfg' - каталог someFolder и его содержимое находится в одном каталоге, что и каталог с программой, т.е. на один уровень выше от самого файла твоей программы.
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 11.04.2009, 17:09   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,089
По умолчанию

Почему это ошибка? .\ - это относительный путь к корню диска, т.е. сохраняем на тот же логический диск
pu4koff вне форума Ответить с цитированием
Старый 11.04.2009, 18:02   #5
Oburec
Пользователь
 
Регистрация: 20.03.2009
Сообщений: 33
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
попробуй делать так:
Код:
filePath:=ExtractFilePath(application.ExeName)+<твой путь>
а если я буду использовать свой код в компоненте, где никакой application и в помине не создается?

Цитата:
Сообщение от Kotofff Посмотреть сообщение
.\ - ошибка. Правильно так ...
Да нет никакой ошибки. .\ - текущий каталог. Реально оказалось, что он действительно сбивается после записи файла. При запуске приложения текущий каталог равен пути к экзешнику, после записи - каталогу с сохраняемым файлом. Кстати вернуть его обратно можно с помощью функции SetCurrentDir(somePath:string)
А вот функция (вдруг кому-нить понадобится), которая преобразует относительный путь в полный.
Код:
function GetFullPath(shortName:string):string;
var
  fullpath:pansichar;
  buffer:string;
  i:integer;
  ch:char;
begin
  setlength(buffer,255);
  GetFullPathName(@shortname[1],255,@Buffer[1],fullpath);
  ch:=char(0);
  i:=pos(ch,buffer);
  setlength(buffer,i-1);
  result:=buffer;
end;
Ну и тоже на всякий случай(если кому понадобится) вторая функция, которая находит файл с заданым именем и возвращает путь к нему. Параметры - стартовая директория, имя файла и глубина поиска (на сколько каталогов в процессе поиска программа углубится).
Код:
// Dir - стартовая директория; name - имя файла; deep - глубина поиска
// Возвращает путь к найденому файлу
function FindFile(name:string;dir:string;var deep:integer):string;
var sr:tSearchRec;
    fullpath,res:string;
    findres:integer;
begin
  // Поиск файла в текущем каталоге
  fullpath:=Dir + name;
  if FindFirst(fullpath, faAnyFile, SR) = 0 then
  begin
    result:=fullpath;
    exit;
  end
  else // Если не найден, то ищем в других каталогах
  begin
    if deep<>0 then
    begin
      findres:=FindFirst(Dir+'*', faDirectory, sr);
      if findres = 0 then
      begin
        // Ограничиваем поиск по глубине
        if deep<>0 then
        begin
        while findres=0 do
          begin
            if (sr.name='.') or (sr.name='..')or (not(sr.Attr = faDirectory)) then
            begin
              FindRes:=FindNext(SR); // продолжить поиск
              continue;
            end;
            dec(deep);
            res:=findfile(name,dir+sr.Name+'\',deep);
            if res <>'' then
            begin
              inc(deep);
              result:=res;
              exit;
            end
            else
              findres:=FindNext(sr);
          end
        end;
      end;
    end;
  end;
  inc(deep);
  FindClose(sr);
end;

Последний раз редактировалось Oburec; 11.04.2009 в 18:08.
Oburec вне форума Ответить с цитированием
Старый 11.04.2009, 18:10   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Oburec Посмотреть сообщение
а если я буду использовать свой код в компоненте, где никакой application и в помине не создается?
Application у тебя есть, ты же приложение запускаешь
TApplication, класс который характеризует приложение
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.04.2009, 18:18   #7
Oburec
Пользователь
 
Регистрация: 20.03.2009
Сообщений: 33
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Application у тебя есть, ты же приложение запускаешь
TApplication, класс который характеризует приложение
в дезайн тайме например TApplication не создается. Не совсем универсальный метод.
Oburec вне форума Ответить с цитированием
Старый 11.04.2009, 18:36   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,089
По умолчанию

Цитата:
Сообщение от Oburec Посмотреть сообщение
в дезайн тайме например TApplication не создается. Не совсем универсальный метод.
В дезайн тайме и приложения вашего нет, так что непонятно путь до чего в дезайн тайме вы искать собрались
pu4koff вне форума Ответить с цитированием
Старый 11.04.2009, 18:43   #9
Oburec
Пользователь
 
Регистрация: 20.03.2009
Сообщений: 33
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
В дезайн тайме и приложения вашего нет, так что непонятно путь до чего в дезайн тайме вы искать собрались
В дезайн тайме .\ означает путь к проекту, хотя exe-ика еще конечно нету. Искать собрался ресурсы компонента.
Oburec вне форума Ответить с цитированием
Старый 11.04.2009, 18:49   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ExtractFilePath(application.ExeName ), аналогично
но в отличие от вашего метода не зависит от текущей папки(она меняется после некоторых действий, если кто не знает)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача. Работа с псевдослучайными последовательностями (ПСП). Работа с цветом. 0101 Помощь студентам 3 17.12.2009 23:57
Проблема с путями к БД и *.dll honor БД в Delphi 5 25.01.2008 08:54