Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> открыть папку по относительному пути 
V
    Опции темы
cupper
Дата 14.1.2011, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



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

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


но вот беда. Папка открывается (дескриптор не равен INVALID_HANDLE_VALUE) только если имя папка указано не в пути а как просто названием папки, типа "bb", само собой тогда открываются только папки в текущей директории.
Но мне нужно именно по пути открывать... как сделать ?
Заранее спасибо.
PM MAIL   Вверх
borisbn
Дата 14.1.2011, 13:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



backslash двойной ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
cupper
Дата 14.1.2011, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Код

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
файл открывается
PM MAIL   Вверх
null56
Дата 14.1.2011, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



а что ты хочешь с директорией сделать?
может быть 
Код

CreateDirectory

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

Добавлено через 1 минуту и 30 секунд
ЗЫ: вообще лучше бы эту тему перенести в Системное программирование/WinApi
PM MAIL   Вверх
cupper
Дата 14.1.2011, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



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

CreateDirectory

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

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

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

Еще раз вопторюсь, что если при открытии папки указывать непосредственно только ее имя (название, т.е. папка находится в директории из которой запускается приложение) то все прекрастно работает. Если же попробывать открыть туже самую папку но уже через путь (например .\test) то тогда перестает работать
PM MAIL   Вверх
null56
Дата 14.1.2011, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



посмотри какая ошибка?
http://msdn.microsoft.com/en-us/library/ms...v=VS.85%29.aspx

Добавлено через 56 секунд
http://msdn.microsoft.com/en-us/library/ms...v=VS.85%29.aspx
PM MAIL   Вверх
cupper
Дата 14.1.2011, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



смотрел, код 2, файл не найден.
PM MAIL   Вверх
null56
Дата 15.1.2011, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



я сейчас смотрю в эту сторону
Цитата

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.

PM MAIL   Вверх
null56
Дата 15.1.2011, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 2
Всего: 12



Цитата(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, используй двойной бекслеш

Это сообщение отредактировал(а) null56 - 15.1.2011, 00:32
PM MAIL   Вверх
cupper
Дата 15.1.2011, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



Цитата(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, используй двойной бекслеш

и через отладчик, и не через него. Без двойного бекслеша у меняб вообще хрень бы получилась, ибо первый бекслеш служит для отметы специального действия второго. Я когда путь приводил, это непосредственно во время работы т.е. когда строка имеет конечный вид и двойной бекслеш превращается таки в обычный одинарный. Черт, почемуж у меня тогда не работает :( завтро еще раз проверю, на другой машине код.
PM MAIL   Вверх
jonie
Дата 15.1.2011, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



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

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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
cupper
Дата 15.1.2011, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: 1
Всего: 1



ошибка была найдена. Ошибка была в логике, неправильно формировал путь для случая с папками, лишний раз добавлял название папки :(
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1324 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.