| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > путь к файлу |
| Автор: larinva 14.10.2009, 22:32 |
| Всем привет! подскажите какой функцией пользоваться чтобы не указывать явный путь к файлу пример (LoadFromFile(c:\12\nm.txt)) а то если изменищь директорю придется вносить изменение и в программе |
| Автор: Keeper89 14.10.2009, 23:09 | ||
Если nm.txt лежит в папке с программой. можно использовать
|
| Автор: Данкинг 14.10.2009, 23:52 |
| Если ты перемещаешь файл, то программе так и так нужно каким-то образом дать знать об этом. К примеру, создать файл конфигурации для хранения списка путей к файлам, и в этом списке уже изменять пути. Ну, конечно, ещё можно предусмотреть в программе какой-нибудь поиск файла. Но это, сам понимаешь, каково будет по скорости - искать новый каталог файла по всему винту. |
| Автор: Akella 15.10.2009, 09:23 |
| Советую не делать так. А реализовать работу с файлами, как это сделано во многих нормальных программах - работа с файлами в папке Мои документы или лучше в папке "C:\Documents and Settings\имя_пользователя\Application Data", в противном случае винда может не дать программе доступ к файлу, особенно если программа будет установлена в папке Program files. Всё равно когда-нибудь прийдётся переделывать, не сегодня, так через год. Так почему бы сразу не реализовать правильно? |
| Автор: larinva 15.10.2009, 10:20 |
| Всем сп-бо направление понял тема может быть закрыта! |
| Автор: northener 11.11.2011, 20:14 |
| Советую использовать функцию SHGetSpecialFolderPath с параметром CSIDL_MYDOCUMENTS |
| Автор: CodeMonkey 11.11.2011, 22:34 |
| Подгоню ссылочку: http://www.gunsmoker.ru/2011/09/blog-post_11.html (код в конце). |
| Автор: northener 11.11.2011, 23:46 |
Хм. Эту статью я ещё не видел. И "FOLDERID" меня заинтересовал. У вас, Александр всегда под рукой ссылки. Не могли бы вы подкинуть сюда ещё и ссылку на статью или что-либо другое, что объяснит чем "старый"вызов ShGet(Special)Folderxxx может обломаться на Vista+. Есть у меня и "особый/шкурный" интерес. |
| Автор: CodeMonkey 11.11.2011, 23:51 |
| Он должен нормально работать, ИМХО. Но пути к новым папкам через него не получить - нет констант. |
| Автор: northener 12.11.2011, 00:21 | ||
А какие "новые" папки имеются в виду? Или это "задел" на "новые разработки"? |
| Автор: Lols 12.11.2011, 02:49 | ||
Ну, это тогда просто нужно будет учесть и все - не смертельно. Или я не права? |
| Автор: CodeMonkey 12.11.2011, 03:13 | ||
Физические папки: FOLDERID_Contacts, FOLDERID_DeviceMetadataStore, FOLDERID_DocumentsLibrary, FOLDERID_Downloads, FOLDERID_GameTasks, FOLDERID_ImplicitAppShortcuts, FOLDERID_Libraries, FOLDERID_Links, FOLDERID_LocalAppDataLow, FOLDERID_MusicLibrary, FOLDERID_PhotoAlbums, FOLDERID_PicturesLibrary, FOLDERID_Playlists, FOLDERID_ProgramFilesX64, FOLDERID_ProgramFilesCommonX64, FOLDERID_Public, FOLDERID_PublicDownloads, FOLDERID_PublicGameTasks, FOLDERID_PublicLibraries, FOLDERID_PublicRingtones, FOLDERID_QuickLaunch, FOLDERID_RecordedTVLibrary, FOLDERID_Ringtones, FOLDERID_SampleMusic, FOLDERID_SamplePictures, FOLDERID_SamplePlaylists, FOLDERID_SampleVideos, FOLDERID_SavedGames, FOLDERID_SavedSearches, FOLDERID_SidebarDefaultParts, FOLDERID_SidebarParts, FOLDERID_UserPinned, FOLDERID_UserProfiles, FOLDERID_UserProgramFiles, FOLDERID_UserProgramFilesCommon, FOLDERID_VideosLibrary Виртуальные папки: FOLDERID_AddNewPrograms, FOLDERID_AppUpdates, FOLDERID_ChangeRemovePrograms, FOLDERID_ConflictFolder, FOLDERID_Games, FOLDERID_HomeGroup, FOLDERID_OriginalImages, FOLDERID_SEARCH_CSC, FOLDERID_SEARCH_MAPI, FOLDERID_SearchHome, FOLDERID_SyncManagerFolder, FOLDERID_SyncResultsFolder, FOLDERID_SyncSetupFolder, FOLDERID_UsersFiles, FOLDERID_UsersLibraries Я выделил жирным интересные (на мой взгляд) папки.
Разумеется. Хотя, смотря как "учитывать". К примеру, папка для сейвов игр. В XP мы можем учесть её отсутствие и писать в AppData - окей. Но если ровно же этот код мы будем использовать и в Vista+, то получится, что мы его пишем не туда - вот тебе и "учли". Добавлено через 6 минут и 25 секунд Итого: если в программе мы хотим работать только с папками, которые входят в CSIDL, то использовать ShGet(Special)FolderXXX - это окей. Это будет работать и работать корректно. Никаких проблем тут нет, обратная совместимость - конёк Microsoft. Да, можно проверять версию системы и использовать функции ShGetKnownFolderXXX на Vista+. Но вы от этого ничего не выиграете, а даже скорее наоборот - теперь в вашем коде две ветки (и в два раза больше кода). Но если нам надо получать хотя бы одну новую папку (из Vista+), то (ИМХО) лучше использовать ShGet(Special)FolderXXX-функции на XP и ниже, и ShGetKnownFolderXXX - на Vista и выше. Чисто по соображениям единообразия. |
| Автор: northener 12.11.2011, 03:28 |
Ну мне это "не интересно". Ну а в целом, спасибо! |
| Автор: Akella 12.11.2011, 21:12 | ||
|
| Автор: northener 13.11.2011, 00:25 |
А кто и где нам в Микрософте обещал, что реестр для всех версий Винды будет совместим? Обещали нам только, что API'шные функции будут совместимы (в меру возможностей). |
| Автор: CodeMonkey 13.11.2011, 00:26 |
От тебя не ожидал. http://www.transl-gunsmoker.ru/2008/12/shell-folders.html |
| Автор: Akella 14.11.2011, 10:52 | ||||
ты путаешь функции модератора и обычного пользователя форума, не делай этого Добавлено через 4 минуты и 24 секунды
судя по этой ссылке: http://msdn.microsoft.com/en-us/library/bb762494(v=VS.85).aspx константа CSIDL_MYDOCUMENTS появилась в Version 6.0. (http://msdn.microsoft.com/en-us/library/bb776779(v=VS.85).aspx) А до этого её не было. Или я ошибаюсь? Таким образом в Windows 2000 программы выдаст исключение, так? |
| Автор: CodeMonkey 14.11.2011, 14:49 | ||
Ты смотришь на виртуальную My documents. Она - с XP, да. А физическая My documents была и до этого. |
| Автор: Akella 14.11.2011, 17:06 |
| не понял :( |
| Автор: CodeMonkey 14.11.2011, 17:07 |
| По твоей ссылке см. CSIDL_PERSONAL |
| Автор: Akella 14.11.2011, 21:19 |
| Т.е. мне предварительно нужно вычислить версию винды, а уж потом выбирать, какую константу использовать? |
| Автор: northener 14.11.2011, 23:08 | ||||
Понял. Добавлено @ 23:12
Имхо, Винда сама разберется куда писать и откуда читать, если использовать именно CSIDL_PERSONAL. |
| Автор: CodeMonkey 15.11.2011, 08:46 | ||
Нет, эти две константы равны. Просто до XP Мои документы была физической папкой. |
| Автор: Akella 17.11.2011, 12:46 | ||||||
тогда зачем вторая константа? Добавлено через 1 минуту и 1 секунду
в семёрке папка Documents тоже физическая Добавлено через 2 минуты и 43 секунды Где я не прав? Путь к папке Мои документы в реестре живёт уже лет 20. Вы думаете, что с помощью константы винда как-то по другому путь вычисляет? В итоге всё равно всё сводится к реестру. |
| Автор: CodeMonkey 17.11.2011, 15:36 | ||||||||
Это не вторая константа. Это одна и та же константа. Но у неё два имени. Её второе имя добавили в XP. До XP была только PERSONAL. Вообще-то в Win7 нет папки Мои документы. Если у тебя Win7 стоит - попробуй тыкнуть в "Документы". Увидишь интересную надпись "Documents Library; includes: 2 location(s)". Ты про что конкретно? Ты дофига где не прав 1.
Где не прав: http://www.transl-gunsmoker.ru/2008/12/shell-folders.html Чёрным по белому разработчик Windows говорит, что твой способ - неправильный. Специально для тебя в Windows 7 в том ключе создали значение "!Do not use this registry key" с данными "Use the SHGetFolderPath or SHGetKnownFolderPath function instead". 2. Где не прав: CSIDL_PERSONAL была всегда. 3.
Где не прав: CSIDL_MYDOCUMENTS = CSIDL_PERSONAL. ShlObj.h:
4. Где не прав: в Windows 7 нет папки Мои документы. Есть библиотека "Документы". Даже если брать утверждение для XP, это не совсем верное. До XP Мои документы была физической папкой, представленной на рабочем столе. Т.е. прямо в папке рабочего стола была физическая папка Мои документы. И ей соответствовала CSIDL_PERSONAL. Всегда. Ферштейн? А в XP Мои документы более не является физической папкой. Если ты посмотришь на физическое хранилище рабочего стола, то никакой Мои документы там не будет. Понимаешь? У Моих документов есть физическое хранилище, но сама папка, начиная с XP, - виртуальная. В этом же время ввели псевдоним CSIDL_MyDocuments. Он тождественно равен CSIDL_PERSONAL. PIDL к виртуальной папке (виртуальная Мои документы на рабочем столе) или путь к физической (физическое хранилище Мои документы) - возвращаются разными функциями. Вот так надо трактовать документацию. 5. Где не прав: люди перебегают на красный свет со времён появления светофоров. Из чего не следует, что это правильно. 6.
Где не прав: "знали ли вы, что если вы ни разу не открывали свою папку "Шрифты", и никакая программа ни разу не вызывала SHGetSpecialFolderLocation(CSIDL_FONTS), то никакой записи "Fonts" в ключе "Shell Folders" не будет?" Как видишь, по другому. Функция возвращает результат всегда, реестр - не всегда. 7. Где не прав: http://www.transl-gunsmoker.ru/2008/12/shell-folders.html Чёрным по белому разработчик Windows говорит, что реестр не является первоисточником этой информации. Это поведение было убрано ещё в бетах Windows 95. Добавлено через 4 минуты и 1 секунду Чтобы было совсем ясно: есть разница между "это - работает" и "это - правильно". |
| Автор: Akella 18.11.2011, 17:41 | ||||||||||
Зачем мне использовать её второе имя. У константы не может быть два имени. Это просто два константы или две переменных, ссылающиеся на одно и тоже значение. Мне так кажется. Добавлено @ 17:42
а где я писал, что Мои документы в семёрке физическая папка Добавлено @ 17:42
ФСЁ, ты забанен Добавлено @ 17:44
но это работает до сих пор, уже почти 20 лет Добавлено @ 17:47 Зачем тогда CSIDL_MYDOCUMENTS? Это вносит путаницу. Добавлено @ 17:49
и в Win2000? Добавлено через 10 минут с трудом верится Добавлено через 11 минут и 20 секунд
но это не про папку Мои документы Добавлено через 13 минут и 23 секунды В любом случае я понял. Короче наворотили разработчики винды..... |
| Автор: northener 18.11.2011, 23:43 |
Т.е. Это в сочетании с вышенаписанным следует читать "Понял, но не принял"! А разве мы все (разработчики) не "обязаны" поддерживать обратную совместимость? А порой из-за изначальной непродуманности проекта обратная совместимость может быть реализована только костылями. :( |
| Автор: Lols 19.11.2011, 01:55 |
| Уважаемые, определитесь про 7ю винду - тут уже у меня шкурный интерес. Так что с папкой? |
| Автор: northener 19.11.2011, 02:02 | ||
А какие проблемы с папкой? |
| Автор: northener 19.11.2011, 02:29 |
| Используйте WinAPI-шные функции типа ShGetxxx и "пребудет вам щастье" |
| Автор: Akella 19.11.2011, 10:31 | ||
А что с папкой? Добавлено через 44 секунды По-моему тут нам уже разъяснили более чем достаточно. Разве нет? |
| Автор: Akella 19.11.2011, 16:01 |
Модератор: Сообщение скрыто. |
| Автор: Akella 23.12.2011, 14:31 | ||
| Да, Вы оказались правы. Пришлось использовать SHGetSpecialFolderPath с параметром CSIDL_PERSONAL А вот параметр CSIDL_MYDOCUMENTS не помог :(
|