Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > открыть папку по относительному пути


Автор: cupper 14.1.2011, 11:12
Нужно отрыть папку имея относительный путь, что то типа .\aa\bb, где bb это не файл а папка. 
Использую следующий код
Код

hfile = CreateFile(pathToFile, GENERIC_READ | GENERIC_WRITE, 0 , NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);


но вот беда. Папка открывается (дескриптор не равен INVALID_HANDLE_VALUE) только если имя папка указано не в пути а как просто названием папки, типа "bb", само собой тогда открываются только папки в текущей директории.
Но мне нужно именно по пути открывать... как сделать ?
Заранее спасибо.

Автор: borisbn 14.1.2011, 13:49
backslash двойной ?

Автор: cupper 14.1.2011, 14:10
Код

if (handle.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    {
        //wsprintf(pathToFile, L"%s\\", pathToFile);
        hfile = CreateFile(pathToFile, GENERIC_READ | GENERIC_WRITE, 0 , NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
    }
    else
    {
        hfile = CreateFile(pathToFile,
                            GENERIC_READ | GENERIC_WRITE,
                            FILE_SHARE_WRITE | FILE_SHARE_READ,
                            NULL,
                            OPEN_EXISTING,
                            FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
                            0);
    }

если директория: 
pathToFile = .\Debug\aaa\ipch\test-ee6ba453\test-ee6ba453
директория не открывается
иначе:
pathToFile = .\Debug\aaa\ipch\test-ee6ba453\test-2434c52c.ipch
файл открывается

Автор: null56 14.1.2011, 18:21
а что ты хочешь с директорией сделать?
может быть 
Код

CreateDirectory

http://msdn.microsoft.com/en-us/library/aa363855%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/aa363950%28v=VS.85%29.aspx

Добавлено через 1 минуту и 30 секунд
ЗЫ: вообще лучше бы эту тему перенести в Системное программирование/WinApi

Автор: cupper 14.1.2011, 23:31
Цитата(null56 @ 14.1.2011,  18:21)
а что ты хочешь с директорией сделать?
может быть 
Код

CreateDirectory

http://msdn.microsoft.com/en-us/library/aa363855%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/aa363950%28v=VS.85%29.aspx

Добавлено @ 18:23
ЗЫ: вообще лучше бы эту тему перенести в Системное программирование/WinApi

нет, именно открыть уже существующую. Получить дескриптор на нее, да еще и с возможностью записи. А далее всячески не гуманно извращаться с ним. В частности поменять у папки аттрибуты времени создания/модификации.

Еще раз вопторюсь, что если при открытии папки указывать непосредственно только ее имя (название, т.е. папка находится в директории из которой запускается приложение) то все прекрастно работает. Если же попробывать открыть туже самую папку но уже через путь (например .\test) то тогда перестает работать

Автор: null56 14.1.2011, 23:35
посмотри какая ошибка?
http://msdn.microsoft.com/en-us/library/ms679360%28v=VS.85%29.aspx

Добавлено через 56 секунд
http://msdn.microsoft.com/en-us/library/ms681381%28v=VS.85%29.aspx

Автор: cupper 14.1.2011, 23:57
смотрел, код 2, файл не найден.

Автор: null56 15.1.2011, 00:00
я сейчас смотрю в эту сторону
Цитата

To extend this limit to 32,767 wide characters, call the Unicode version of the function and prepend "\\?\" to the path. For more information, see Naming a File. For information on special device names, see Defining an MS-DOS Device Name.

Автор: null56 15.1.2011, 00:29
Цитата(cupper @  14.1.2011,  23:31 Найти цитируемый пост)
Еще раз вопторюсь, что если при открытии папки указывать непосредственно только ее имя (название, т.е. папка находится в директории из которой запускается приложение) то все прекрастно работает. Если же попробывать открыть туже самую папку но уже через путь (например .\test) то тогда перестает работать 

ты случайно не через отладчик проверяешь??? если да, то это чревато сменой каталога, который выставляет среда, запускай ехешник сам
вот рабочий код. ехешник находится в одном каталоге с папкой test
Код

int main()
{
    TCHAR buff[255] = L"..\\Debug\\.\\test";
    HANDLE hfile = CreateFile(buff, GENERIC_READ | GENERIC_WRITE, 0 , NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
    if (hfile != INVALID_HANDLE_VALUE)
    {
        printf("sucess\n");
    }
    else
    {
        printf("fail\n");
    }
    getchar();
    return 0;
}


Добавлено @ 00:30
и как тебе сказал borisbn, используй двойной бекслеш

Автор: cupper 15.1.2011, 01:19
Цитата(null56 @ 15.1.2011,  00:29)
ты случайно не через отладчик проверяешь??? если да, то это чревато сменой каталога, который выставляет среда, запускай ехешник сам
вот рабочий код. ехешник находится в одном каталоге с папкой test
Код

int main()
{
    TCHAR buff[255] = L"..\\Debug\\.\\test";
    HANDLE hfile = CreateFile(buff, GENERIC_READ | GENERIC_WRITE, 0 , NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
    if (hfile != INVALID_HANDLE_VALUE)
    {
        printf("sucess\n");
    }
    else
    {
        printf("fail\n");
    }
    getchar();
    return 0;
}


Добавлено @ 00:30
и как тебе сказал borisbn, используй двойной бекслеш

и через отладчик, и не через него. Без двойного бекслеша у меняб вообще хрень бы получилась, ибо первый бекслеш служит для отметы специального действия второго. Я когда путь приводил, это непосредственно во время работы т.е. когда строка имеет конечный вид и двойной бекслеш превращается таки в обычный одинарный. Черт, почемуж у меня тогда не работает :( завтро еще раз проверю, на другой машине код.

Автор: jonie 15.1.2011, 12:06
получить лучше все-равно полный путь.
Для винды используйте связку GetCurrentDirectory+PathCombine+PathCanonicalize
Для nix realpath

В винде определить полный ли путь вам передали можно используя поиск по символу ':' (двоеточие) которое указывает на диск (если, конечно, вы не обрабатываете шаред фолдеры).

Автор: cupper 15.1.2011, 16:53
ошибка была найдена. Ошибка была в логике, неправильно формировал путь для случая с папками, лишний раз добавлял название папки :(

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