|
|
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
Возможно, кто-то сталкивался с подобной проблемой на Windows 10. Мой программный продукт написан на Delphi 2009, должен работать на операционных системах от WinXP до Win10. Инсталлятор устанавливает мой программный продукт на диск пользователя, файл настроек программы хранится здесь: C:\Users\<имя_пользователя>\AppData\Roaming\MyProgram\MyProgram.ini Это файл совершенно точно существует, инсталлятор отрабатывает нормально. Затем пользователь запускает программу, работает с ней, меняет настройки, и при выходе программа сохраняет настройки в файле конфигурации. Вот программный код для сохранения файла конфигурации (написал его давно, еще во времена WinXP) : Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. Но некоторые пользователи сообщают, что программа не перезаписывает файл конфигурации. Таких случаев немного, но они есть. Вопрос: в чем может быть проблема? Пользователи запускали программу и с правами администратора, настройки Windows у них самые обычные, системные папки никуда не перемещались. Где надо искать источник проблемы? Это же простое сохранение текстового файла, что может пойти не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2019, 01:26 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
crossa, ProcMon с фильтром на твою программу в руки... Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2019, 01:41 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
Если запустить несколько экземпляров программы - то каждый при закрытии будет записывать в этот единственный файл. Соответственно, в файле окажутся настройки последнего закрытого экземпляра. У пользователя может создаться впечатление что настройки не сохранились, в то время как они сохранились, просто не из того экземпляра программы про который он думает. У вас не такой случай? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2019, 08:33 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
try-ить API функции бессмысленно, т.к. они не кидают исключений. Разве что AV А вот проверять результат все же стоило бы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2019, 10:24 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
Василий 2 try-ить API функции бессмысленно, т.к. они не кидают исключений. Разве что AV А вот проверять результат все же стоило бы В коде у него try на процедуру SaveToFile для TStringList, которая может выдать исключение, чтобы не падало и никто не узнал о проблеме - try\except. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2019, 11:10 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
sql2012 В коде у него try на процедуру SaveToFile для TStringList, которая может выдать исключение, чтобы не падало и никто не узнал о проблеме - try\except. Я про код выше по листингу. Твое замечание о другом фрагменте, но тоже разумное ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2019, 11:36 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
fraks Если запустить несколько экземпляров программы - то каждый при закрытии будет записывать в этот единственный файл. Соответственно, в файле окажутся настройки последнего закрытого экземпляра. У пользователя может создаться впечатление что настройки не сохранились, в то время как они сохранились, просто не из того экземпляра программы про который он думает. Да, это одно из предположений о причинах проблемы. Пользователь сворачивает программу в трей, а операционная система по умолчанию прячет иконки свежеустановленных программных продуктов. Соответственно, пользователь "теряет" программу и запускает ее новый экземпляр со старым файлом конфигурации. Был как минимум один такой случай, после чего добавил в программу возможность запрета запуска нескольких экземпляров программы. Спасибо за ответы. Я опубликовал вопрос на форуме, чтобы узнать, не является ли проблема с доступом к папкам RoamingAppData или, например, MyDocuments распространенной. Попробую использовать функцию ShGetFolderPath только для WinXP, а функцию ShGetKnownFolderPath для всех остальных версий Windows. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2019, 17:32 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
crossa Попробую использовать функцию ShGetFolderPath только для WinXP, а функцию ShGetKnownFolderPath для всех остальных версий Windows. Попробуй наконец использовать функцию GetLastError() и избавится от пустого try-except. Это же лютейший п....ц: crossa Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2019, 17:37 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
crossa, функция GetApplicationDataDir выдает путь типа "с\users\UserName\AppData\Roaming\ProgramName". Не факт, что такая папка существует, если её перед этим явно не создавали. Сможет ли Strings.SaveToFile сохранить файл в таком случае? Я не знаю, но не уверен, что сможет. У меня в аналогичной функции есть ещё вот такое: Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2019, 17:58 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
crossa, а, извиняюсь, когда писал, выпустил из вида вот это: "Это файл совершенно точно существует, инсталлятор отрабатывает нормально. " ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2019, 18:10 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
s62 Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2019, 18:34 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ s62 Код: pascal 1. Посмотрел, да, в ForceDirectories есть Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2019, 19:12 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
s62 _Vasilisk_ пропущено... Эта проверка лишняя Посмотрел, да, в ForceDirectories есть Код: pascal 1. 2. ForceDirectories может выдать исключение, если не сможет создать папку) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2019, 00:19 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
sql2012 s62 пропущено... Посмотрел, да, в ForceDirectories есть Код: pascal 1. 2. ForceDirectories может выдать исключение, если не сможет создать папку) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2019, 10:32 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2019, 10:45 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
s62 sql2012 пропущено... ForceDirectories может выдать исключение, если не сможет создать папку) ну проверить-то не сложно... пустую строку, с запрещенными символами или ... в системную\защищенную папку\флешку с readonly ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2019, 10:47 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
sql2012 s62 пропущено... По документации должен возвратить False, а не сгенерировать исключение, код сейчас не могу посмотреть. ну проверить-то не сложно... пустую строку, с запрещенными символами или ... в системную\защищенную папку\флешку с readonly ) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ну ... а вдруг? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2019, 10:54 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
s62 sql2012 пропущено... ForceDirectories может выдать исключение, если не сможет создать папку) да, проверил... forcedirectories('\\Vboxsvr\документы\1'); SysErrorMessage(GetLastError) = Носитель защищен от записи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2019, 10:55 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
sql2012, я просто в электричке, доберусь до работы посмотрю код. Функции windows ведь не генерируют исключения (обычно), так что исключение там может быть, если оно в самой ForceDirectories создается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2019, 10:57 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
s62 sql2012, я просто в электричке, доберусь до работы посмотрю код. Функции windows ведь не генерируют исключения (обычно), так что исключение там может быть, если оно в самой ForceDirectories создается да делает в частном случае, когда пользователь "указал пустую папку", а программист не проверяя и доверяя - передает в ForceDirectories ... участок с исключением из кода - в сообщении выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2019, 11:00 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
sql2012, Пустая строка - это особый случай, задокументированный кстати, естественно, что создавать папку или файл без имени бессмысленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2019, 11:01 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
s62 sql2012, Пустая строка - это особый случай, задокументированный кстати, естественно, что создавать папку или файл без имени бессмысленно. бессмысленно это обсуждать) пользователи не читают документацию, пока не припрёт программист - тот же пользователь... либо проверки до вызова\либо try ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2019, 11:03 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
sql2012, Ты писал, комментируя мое сообщение: >>>ForceDirectories может выдать исключение, если не сможет создать папку) А оказалось, что если не сможет создать папку, то возвратит результат False. Исключение создастся, если передать в функцию в качестве пути пустую строку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2019, 11:28 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
s62 sql2012, Ты писал, комментируя мое сообщение: >>>ForceDirectories может выдать исключение, если не сможет создать папку) А оказалось, что если не сможет создать папку, то возвратит результат False. Исключение создастся, если передать в функцию в качестве пути пустую строку. И где противоречие? Не может она пустую папку создать? Нет. Исключение выдает? Выдает. Всё как в документации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2019, 12:03 |
|
||
|
Программа не может сохранить файл конфигурации
|
|||
|---|---|---|---|
|
#18+
sql2012, ну я к тому, что в коде, который я привел 22033443 , нужно проверять результат функции и генерация исключения - не дублирование, т.к. если не удастся создать директорию, то ForceDirectories не выбросит исключение, а выдаст результат False. А проверка на пустую строку у ТС есть. А так-то, что стоит проверять входящие параметры и обрабатывать исключения, спора нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2019, 12:27 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39898980&tid=2038795]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
131ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 423ms |

| 0 / 0 |
