Страница 1 из 1

Пути к дирректориям

Добавлено: 15 сен 2004, 05:07
Hup
Вопрос может быть и глупый, но что-то я не понимаю
Как задать путь и дирректории где находится программа,
т.е. есть абсолютный путь c:\pojects\gpad\backup\...бла, бля?
Нужно оставить только \backup\...бла, бля(получается относительный чтоли)

Добавлено: 15 сен 2004, 13:55
Romeo
Проблему обрисуй вначале, а то не понятно ничего. Вопроса ещё не задал, а уже варианты ответа предлагаешь :)

Добавлено: 15 сен 2004, 14:02
Hup
Блин, я столько придумывал как правильно обрисовать вопрос не влезая в дебри... Видимо перестарался :/

Добавлено: 15 сен 2004, 16:17
Hup
Ладно...
Есть папка(1) с прогой, а в ней еще одна папка(2) для backup-ов базы...
Т.е. можно однозначно задать путь к (2) если (1) никогда не будет перемещаться... Как сделать, чтобы разбить такую тупую зависимость?

Добавлено: 15 сен 2004, 17:40
Eugie
Hup, все равно ни фига не понятно :) Если ты о том, как, находясь в папка(1), задать путь к ее подпапке папка(2), то юзай такой синтаксис: ..\папка(2)

Добавлено: 15 сен 2004, 17:45
Romeo
Точнее ".\папка(2)".

Добавлено: 15 сен 2004, 18:00
Eugie
Romeo, прав, конечно. Рука дрогнула :)

Добавлено: 15 сен 2004, 18:13
Romeo
А вообще приёмов много. Всё зависит от того, что тебе требуется, Hup.

1. Хочу, чтобы папка с базой всегда была там, где и экзешник. В этом случае во избежения запуска приложения из другой папки (а такое можно сделать запросто, например в свойствах ярлыка) просто берём ту строчку, которая передаётся в WinMain и извлекаем оттуда путь к приложению. Потом конкатенируем с соответствующим относительным путём. (А ещё есть WinAPI, какая именно не помню, но найти не трудно, которая по дискриптору приложения возвращает путь к его запускному файлу).

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

Добавлено: 16 сен 2004, 10:21
Hup
Хм... Romeo, я имел ввиду первый вариант

Добавлено: 16 сен 2004, 17:56
Hup
Romeo, все оказалось гораздо проще... Кстати я забыл упоминуть , что задача реализуется на C#
Вот решение

Код: Выделить всё

using System.IO;

Код: Выделить всё

string path = Directory.GetCurrentDirectory();
Ну и конечно:
Библиотека классов .NET Framework

Directory.GetCurrentDirectory -метод
Возвращает текущую рабочую папку приложения.

[Visual Basic]
Public Shared Function GetCurrentDirectory() As String

[C#]
public static string GetCurrentDirectory();

[C++]
public: static String* GetCurrentDirectory();

[JScript]
public static function GetCurrentDirectory() : String;

Возвращаемое значение
Строка, содержащая путь к текущей рабочей папке.

Исключения
Тип исключения Условие
UnauthorizedAccessException Вызывающий оператор не имеет необходимых прав доступа.

Примечания
Текущая папка отличается от исходной папки, из которой был запущен процесс.

Пример применения этого метода см. ниже в разделе «Пример». В приведенной ниже таблице содержатся примеры других типичных и сопутствующих задач ввода-вывода.

Действие… Раздел с примером…
Создание текстового файла. Запись текста в файл
Запись в текстовый файл. Запись текста в файл
Чтение из текстового файла. Чтение текста из файла
Просмотр файлов папки. Name
Просмотр вложенных папок в папке. GetDirectories
GetDirectories

Отображение всех файлов во всех вложенных папках в данной папке. GetFileSystemInfos
Поиск размера папки. Directory
Определение наличия файла. Exists
Определение наличия папки. Exists

Пример
[Visual Basic, C#, C++] В приводимом примере демонстрируется использование метода GetCurrentDirectory.

[C#]
using System;
using System.IO;

class Test
{
public static void Main()
{
try
{
// Get the current directory.
string path = Directory.GetCurrentDirectory();
string target = @"c:\temp";
Console.WriteLine("The current directory is {0}", path);
if (!Directory.Exists(target))
{
Directory.CreateDirectory(target);
}

// Change the current directory.
Environment.CurrentDirectory = (target);
if (path.Equals(Directory.GetCurrentDirectory()))
{
Console.WriteLine("You are in the temp directory.");
}
else
{
Console.WriteLine("You are not in the temp directory.");
}
}
catch (Exception e)
{
Console.WriteLine("The process failed: {0}", e.ToString());
}
}
}
[C++]
#using <mscorlib.dll>

using namespace System;
using namespace System::IO;

void main() {
try {
// Get the current directory.
String* path = Directory::GetCurrentDirectory();
String* target = S"c:\\temp";
Console::WriteLine(S"The current directory is {0}", path);
if (!Directory::Exists(target)) {
Directory::CreateDirectory(target);
}

// Change the current directory.
Environment::CurrentDirectory = target;
if (path->Equals(Directory::GetCurrentDirectory())) {
Console::WriteLine(S"You are in the temp directory.");
} else {
Console::WriteLine(S"You are not in the temp directory.");
}
} catch (Exception* e) {
Console::WriteLine(S"The process failed: {0}", e);
}
}