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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2013, 17:04   #1
Trinock
Пользователь
 
Регистрация: 19.09.2011
Сообщений: 21
По умолчанию Не получается загрузить файл по сокращенному имени

Никогда не сталкивался с такой проблемой. Есть exe файл, в той же директории с экзешником находится папка folder, в папке есть файл file.txt, который надо открыть. Проблема вот в чем: если открываем файл по имени "folder//text.txt" то файл не открывается, а если открваем файл по полному имени, вместе с буквой диска, т.е. "E://Program Files//....//folder//text.txt", то все открывается как надо. Пробовал это делать стандартной функцией fopen и ф-ией CreateFile, вызовом:

CreateFile(filePath.c_str(), GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)

она соответсвенно возвращает INVALID_HANDLE_VALUE. В других прогах такого не наблюдаю. Работаю в Visual Studio 2010, может быть в настройках проекта что-то не установил?
Trinock вне форума Ответить с цитированием
Старый 02.07.2013, 17:35   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Есть понятие "текущая директория". Скорее всего, если запустите ЕХЕ напрямую из Explorer то все сработает а если запускать под студией - нет.

В настройках проекта можно указать рабочую директорию - надо указать ту же, что и директория, где лежит ЕХЕ
waleri вне форума Ответить с цитированием
Старый 03.07.2013, 12:59   #3
Trinock
Пользователь
 
Регистрация: 19.09.2011
Сообщений: 21
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Есть понятие "текущая директория". Скорее всего, если запустите ЕХЕ напрямую из Explorer то все сработает а если запускать под студией - нет.

В настройках проекта можно указать рабочую директорию - надо указать ту же, что и директория, где лежит ЕХЕ
Странность как раз в том, что не работает если запускать через explorer.
Trinock вне форума Ответить с цитированием
Старый 03.07.2013, 20:07   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Перед самым открытием файла вызовите GetCurrentDirectory() и напечатайте результат а также напечатайте имя файла именно в том виде, в каком передается в CreateFile()
waleri вне форума Ответить с цитированием
Старый 04.07.2013, 16:03   #5
Trinock
Пользователь
 
Регистрация: 19.09.2011
Сообщений: 21
По умолчанию

В общем получилось все очень странно. Рассказываю полную историю: я работаю над игрой и редактором уровней к ней. Игра построена следующим образом: считаем что exe файл с игрой расположен в некоторой папке ...\\Game, тогда в этой же папке находятся другие папки с игровыми ресурсами: в "...\\Game\\Ani" графика, в "...\\Game\\Music" музыка, в "...\\Game\\Worlds" уровни и т.д. Соответственно если надо загрузить что-то, то пишем к примеру "Ani\\имя_файла". В самой игре все работает отлично. exe от редактора находится в той же папке что и игровой, следовательно к ресурсам можно получать доступ таким же образом и можно использовать уже готовый код из движка. Теперь переходим к редактору уровней: надо открывать файлы на редактирование, это делается с помощью стандартного диалогового окна открытия файла. Допустим открываем файл по адресу

"E:\BouncingBall\Release\Worlds\lev el.lvl",

в результате ни один ресурс загрузить не получается, потому что система не находит файлы по заданному пути. Сделал вывод результата GetCurrentDirectory() прямо перед загрузкой ресурса, получаю такое:

"E:\BouncingBall\Release\Worlds ",

т.е. директория, в которой находится не exe файл с редактором, а файл level.lvl, который мы открыли на редактирование. Ну решил ради эксперимента перебросить все ресурсы в папку "E:\BouncingBall\Release\Worlds " и вуаля - все прекрасно загрузилось. Сделал вывод GetCurrentDirectory() в самом начале работы редактора (до открытия файла), получаю:

"E:\BouncingBall\Release",

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

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

Цитата:
Сообщение от Trinock Посмотреть сообщение
Как это так вообще?
диалоги меняют текущую директорию по умолчанию, ибо они пользуются этим механизмом.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.07.2013, 17:17   #7
Trinock
Пользователь
 
Регистрация: 19.09.2011
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
диалоги меняют текущую директорию по умолчанию, ибо они пользуются этим механизмом.
Если это нужно для работы диалогового окна, можно было бы сделать, чтобы после работы текущая директория восстанавливалась на прежнюю. В общем как я понял самое правильное решение, это получать при старте текущую директорию и открывать файлы по полному пути.
Trinock вне форума Ответить с цитированием
Старый 04.07.2013, 19:58   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Trinock Посмотреть сообщение
Если это нужно для работы диалогового окна, можно было бы сделать, чтобы после работы текущая директория восстанавливалась на прежнюю. В общем как я понял самое правильное решение, это получать при старте текущую директорию и открывать файлы по полному пути.
вы в любой момент можете узнать директорию где находитесь, вы же имеете путь к себе.
я за время работы принял решение что не стоит применять относительные пути в принципе.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузить файл на сервер frommars PHP 1 08.01.2013 11:59
WinInet загрузить файл во временной файл , использовать, потом удалить Человек_Борща Работа с сетью в Delphi 5 03.08.2010 13:46
Как загрузить файл? Suren Общие вопросы C/C++ 1 06.03.2010 21:47
не получается загрузить рисунок с расширением jpeg в компонент Image s2dentishe Помощь студентам 2 09.01.2010 02:04
Загрузить png файл MAcK Мультимедиа в Delphi 1 22.12.2008 22:23