|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
02.07.2013, 17:04 | #1 |
Пользователь
Регистрация: 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, может быть в настройках проекта что-то не установил? |
02.07.2013, 17:35 | #2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
Есть понятие "текущая директория". Скорее всего, если запустите ЕХЕ напрямую из Explorer то все сработает а если запускать под студией - нет.
В настройках проекта можно указать рабочую директорию - надо указать ту же, что и директория, где лежит ЕХЕ |
03.07.2013, 12:59 | #3 |
Пользователь
Регистрация: 19.09.2011
Сообщений: 21
|
Странность как раз в том, что не работает если запускать через explorer.
|
03.07.2013, 20:07 | #4 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
Перед самым открытием файла вызовите GetCurrentDirectory() и напечатайте результат а также напечатайте имя файла именно в том виде, в каком передается в CreateFile()
|
04.07.2013, 16:03 | #5 |
Пользователь
Регистрация: 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. |
04.07.2013, 16:58 | #6 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
диалоги меняют текущую директорию по умолчанию, ибо они пользуются этим механизмом.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
04.07.2013, 17:17 | #7 |
Пользователь
Регистрация: 19.09.2011
Сообщений: 21
|
Если это нужно для работы диалогового окна, можно было бы сделать, чтобы после работы текущая директория восстанавливалась на прежнюю. В общем как я понял самое правильное решение, это получать при старте текущую директорию и открывать файлы по полному пути.
|
04.07.2013, 19:58 | #8 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
я за время работы принял решение что не стоит применять относительные пути в принципе. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Загрузить файл на сервер | 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 |