powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Программа не может сохранить файл конфигурации
25 сообщений из 26, страница 1 из 2
Программа не может сохранить файл конфигурации
    #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
Программа не может сохранить файл конфигурации
    #39898358
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crossa,

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

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

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



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

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

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

Спасибо за ответы. Я опубликовал вопрос на форуме, чтобы узнать, не является ли проблема с доступом к папкам RoamingAppData или, например, MyDocuments распространенной. Попробую использовать функцию ShGetFolderPath только для WinXP, а функцию ShGetKnownFolderPath для всех остальных версий Windows.
...
Рейтинг: 0 / 0
Программа не может сохранить файл конфигурации
    #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
Программа не может сохранить файл конфигурации
    #39898780
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
Программа не может сохранить файл конфигурации
    #39898787
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crossa,
а, извиняюсь, когда писал, выпустил из вида вот это: "Это файл совершенно точно существует, инсталлятор отрабатывает нормально. "
...
Рейтинг: 0 / 0
Программа не может сохранить файл конфигурации
    #39898801
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
Код: pascal
1.
if not DirectoryExists(Result)

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


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

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

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



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

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



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

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


ну проверить-то не сложно...
пустую строку,
с запрещенными символами
или ... в системную\защищенную папку\флешку с readonly )
...
Рейтинг: 0 / 0
Программа не может сохранить файл конфигурации
    #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
Программа не может сохранить файл конфигурации
    #39898973
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
sql2012
пропущено...

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


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

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


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

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

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


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


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


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