Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Программа не может сохранить файл конфигурации / 25 сообщений из 26, страница 1 из 2
05.12.2019, 01:26
    #39898357
crossa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
Возможно, кто-то сталкивался с подобной проблемой на 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.
const ProgramName = 'MyProgram';

var IniStringList: TStringList;

function GetApplicationDataDir: string;
var Path: PChar;
    s: String;
begin
     s:='';
     GetMem(Path,(MAX_PATH + 1) * SizeOf(WideChar));
     try
        try
           if ShGetFolderPath(0,CSIDL_APPDATA,0,0,Path)=s_OK then s:=StrPas(Path);
        except end;
        if s<>'' then
        begin
             if s[Length(s)]<>'\' then s:=s+'\';
             s:=s+ProgramName+'\';
        end else s:=ExtractFilePath(Application.ExeName);
     finally FreeMem(Path); end;
     Result:=s;
end;

try 
   IniStringList.SaveToFile(GetApplicationDataDir+ProgramName+'.ini',TEncoding.UTF8); 
except end;



Но некоторые пользователи сообщают, что программа не перезаписывает файл конфигурации. Таких случаев немного, но они есть. Вопрос: в чем может быть проблема? Пользователи запускали программу и с правами администратора, настройки Windows у них самые обычные, системные папки никуда не перемещались. Где надо искать источник проблемы? Это же простое сохранение текстового файла, что может пойти не так?
...
Рейтинг: 0 / 0
05.12.2019, 01:41
    #39898358
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
crossa,

ProcMon с фильтром на твою программу в руки...

Код: pascal
1.
2.
3.
except 
  вот здесь проблема и ты ее не сообщаешь
end;
...
Рейтинг: 0 / 0
05.12.2019, 08:33
    #39898390
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
Если запустить несколько экземпляров программы - то каждый при закрытии будет записывать в этот единственный файл. Соответственно, в файле окажутся настройки последнего закрытого экземпляра. У пользователя может создаться впечатление что настройки не сохранились, в то время как они сохранились, просто не из того экземпляра программы про который он думает.

У вас не такой случай?
...
Рейтинг: 0 / 0
05.12.2019, 10:24
    #39898443
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
try-ить API функции бессмысленно, т.к. они не кидают исключений. Разве что AV
А вот проверять результат все же стоило бы
...
Рейтинг: 0 / 0
05.12.2019, 11:10
    #39898466
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
Василий 2
try-ить API функции бессмысленно, т.к. они не кидают исключений. Разве что AV
А вот проверять результат все же стоило бы



В коде у него try на процедуру SaveToFile для TStringList, которая может выдать исключение,
чтобы не падало и никто не узнал о проблеме - try\except.
...
Рейтинг: 0 / 0
05.12.2019, 11:36
    #39898485
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
sql2012
В коде у него try на процедуру SaveToFile для TStringList, которая может выдать исключение,
чтобы не падало и никто не узнал о проблеме - try\except.

Я про код выше по листингу. Твое замечание о другом фрагменте, но тоже разумное
...
Рейтинг: 0 / 0
05.12.2019, 17:32
    #39898763
crossa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
fraks
Если запустить несколько экземпляров программы - то каждый при закрытии будет записывать в этот единственный файл. Соответственно, в файле окажутся настройки последнего закрытого экземпляра. У пользователя может создаться впечатление что настройки не сохранились, в то время как они сохранились, просто не из того экземпляра программы про который он думает.

Да, это одно из предположений о причинах проблемы. Пользователь сворачивает программу в трей, а операционная система по умолчанию прячет иконки свежеустановленных программных продуктов. Соответственно, пользователь "теряет" программу и запускает ее новый экземпляр со старым файлом конфигурации. Был как минимум один такой случай, после чего добавил в программу возможность запрета запуска нескольких экземпляров программы.

Спасибо за ответы. Я опубликовал вопрос на форуме, чтобы узнать, не является ли проблема с доступом к папкам RoamingAppData или, например, MyDocuments распространенной. Попробую использовать функцию ShGetFolderPath только для WinXP, а функцию ShGetKnownFolderPath для всех остальных версий Windows.
...
Рейтинг: 0 / 0
05.12.2019, 17:37
    #39898768
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
crossa
Попробую использовать функцию ShGetFolderPath только для WinXP, а функцию ShGetKnownFolderPath для всех остальных версий Windows.

Попробуй наконец использовать функцию GetLastError() и избавится от пустого try-except.

Это же лютейший п....ц:
crossa
Код: pascal
1.
2.
3.
try 
   IniStringList.SaveToFile(GetApplicationDataDir+ProgramName+'.ini',TEncoding.UTF8); 
except end;

...
Рейтинг: 0 / 0
05.12.2019, 17:58
    #39898780
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
crossa,
функция GetApplicationDataDir выдает путь типа "с\users\UserName\AppData\Roaming\ProgramName".
Не факт, что такая папка существует, если её перед этим явно не создавали. Сможет ли Strings.SaveToFile сохранить файл в таком случае? Я не знаю, но не уверен, что сможет. У меня в аналогичной функции есть ещё вот такое:
Код: pascal
1.
2.
3.
  if not DirectoryExists(Result)
  then if not ForceDirectories(Result)
  then Raise Exception.Create('Не удалось создать директорию '+ Result);
...
Рейтинг: 0 / 0
05.12.2019, 18:10
    #39898787
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
crossa,
а, извиняюсь, когда писал, выпустил из вида вот это: "Это файл совершенно точно существует, инсталлятор отрабатывает нормально. "
...
Рейтинг: 0 / 0
05.12.2019, 18:34
    #39898801
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
s62
Код: pascal
1.
if not DirectoryExists(Result)

Эта проверка лишняя
...
Рейтинг: 0 / 0
05.12.2019, 19:12
    #39898823
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
_Vasilisk_
s62
Код: pascal
1.
if not DirectoryExists(Result)


Эта проверка лишняя

Посмотрел, да, в ForceDirectories есть
Код: pascal
1.
2.
  if DirectoryExists(Dir) then
    Exit;
...
Рейтинг: 0 / 0
06.12.2019, 00:19
    #39898891
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
s62
_Vasilisk_
пропущено...
Эта проверка лишняя

Посмотрел, да, в ForceDirectories есть
Код: pascal
1.
2.
  if DirectoryExists(Dir) then
    Exit;



ForceDirectories может выдать исключение, если не сможет создать папку)
...
Рейтинг: 0 / 0
06.12.2019, 10:32
    #39898960
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
sql2012
s62
пропущено...

Посмотрел, да, в ForceDirectories есть
Код: pascal
1.
2.
  if DirectoryExists(Dir) then
    Exit;



ForceDirectories может выдать исключение, если не сможет создать папку)
По документации должен возвратить False, а не сгенерировать исключение, код сейчас не могу посмотреть.
...
Рейтинг: 0 / 0
06.12.2019, 10:45
    #39898965
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
s62
По документации должен возвратить False, а не сгенерировать исключение
опять обманули
...
Рейтинг: 0 / 0
06.12.2019, 10:47
    #39898968
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
s62
sql2012
пропущено...

ForceDirectories может выдать исключение, если не сможет создать папку)
По документации должен возвратить False, а не сгенерировать исключение, код сейчас не могу посмотреть.


ну проверить-то не сложно...
пустую строку,
с запрещенными символами
или ... в системную\защищенную папку\флешку с readonly )
...
Рейтинг: 0 / 0
06.12.2019, 10:54
    #39898971
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
sql2012
s62
пропущено...
По документации должен возвратить False, а не сгенерировать исключение, код сейчас не могу посмотреть.


ну проверить-то не сложно...
пустую строку,
с запрещенными символами
или ... в системную\защищенную папку\флешку с readonly )




Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 
 System.SysUtils
....

if Dir = '' then
  begin
    E := EInOutError.CreateRes(@SCannotCreateDir);
    E.ErrorCode := 3;
    raise E;
  end;



ну ... а вдруг?
...
Рейтинг: 0 / 0
06.12.2019, 10:55
    #39898973
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
s62
sql2012
пропущено...

ForceDirectories может выдать исключение, если не сможет создать папку)
По документации должен возвратить False, а не сгенерировать исключение, код сейчас не могу посмотреть.


да, проверил...

forcedirectories('\\Vboxsvr\документы\1');
SysErrorMessage(GetLastError) = Носитель защищен от записи
...
Рейтинг: 0 / 0
06.12.2019, 10:57
    #39898975
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
sql2012, я просто в электричке, доберусь до работы посмотрю код. Функции windows ведь не генерируют исключения (обычно), так что исключение там может быть, если оно в самой ForceDirectories создается
...
Рейтинг: 0 / 0
06.12.2019, 11:00
    #39898977
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
s62
sql2012, я просто в электричке, доберусь до работы посмотрю код. Функции windows ведь не генерируют исключения (обычно), так что исключение там может быть, если оно в самой ForceDirectories создается


да делает в частном случае, когда пользователь "указал пустую папку", а программист не проверяя и доверяя - передает в ForceDirectories ... участок с исключением из кода - в сообщении выше.
...
Рейтинг: 0 / 0
06.12.2019, 11:01
    #39898980
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
sql2012,

Пустая строка - это особый случай, задокументированный кстати, естественно, что создавать папку или файл без имени бессмысленно.
...
Рейтинг: 0 / 0
06.12.2019, 11:03
    #39898982
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
s62
sql2012,

Пустая строка - это особый случай, задокументированный кстати, естественно, что создавать папку или файл без имени бессмысленно.


бессмысленно это обсуждать)
пользователи не читают документацию, пока не припрёт
программист - тот же пользователь...
либо проверки до вызова\либо try ...
...
Рейтинг: 0 / 0
06.12.2019, 11:28
    #39898997
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
sql2012,
Ты писал, комментируя мое сообщение:
>>>ForceDirectories может выдать исключение, если не сможет создать папку)
А оказалось, что если не сможет создать папку, то возвратит результат False. Исключение создастся, если передать в функцию в качестве пути пустую строку.
...
Рейтинг: 0 / 0
06.12.2019, 12:03
    #39899017
sql2012
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
s62
sql2012,
Ты писал, комментируя мое сообщение:
>>>ForceDirectories может выдать исключение, если не сможет создать папку)
А оказалось, что если не сможет создать папку, то возвратит результат False. Исключение создастся, если передать в функцию в качестве пути пустую строку.


И где противоречие?
Не может она пустую папку создать? Нет. Исключение выдает? Выдает.
Всё как в документации.
...
Рейтинг: 0 / 0
06.12.2019, 12:27
    #39899034
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Программа не может сохранить файл конфигурации
sql2012,
ну я к тому, что в коде, который я привел 22033443 , нужно проверять результат функции и генерация исключения - не дублирование, т.к. если не удастся создать директорию, то ForceDirectories не выбросит исключение, а выдаст результат False. А проверка на пустую строку у ТС есть.
А так-то, что стоит проверять входящие параметры и обрабатывать исключения, спора нет.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Программа не может сохранить файл конфигурации / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]