|
Некорректная работа с файлом
|
|||
---|---|---|---|
#18+
Есть дистрибутив, собранный в "Advanced Installer" (но это, думаю, не важно). Дистрибутив (как это часто бывает) в "Program Files (x86)" распаковывает программу, написанную в .NET, и необходимые ей файлы, в том числе некий файл настроек (например, "C:\Program Files (x86)\Proga\Settings"). Одна из возможностей программы - это считывать файл настроек и перезаписывать его. Но осуществляется это очень странно! Запись происходит успешно, без каких-либо ошибок простым способом: File.WriteAllText(@"C:\Program Files (x86)\Proga\Settings", fileTextBuilder.ToString(), Encoding.UTF8); Но по факту файл не меняется! Хотя программа при повторном его чтении (тоже простым способом): string[] settings = File.ReadAllLines(@"C:\Program Files (x86)\Proga\Settings", Encoding.UTF8); получает данные с учётом внесённых ей раннее изменений! Причём в режиме отладки программа считывает реальное содержимое файла, а скомпилированная программа - данные с учётом внесённых ей изменений. От куда она их берёт!? Написал отдельное Console-приложение, которое просто считывает этот файл: string s = File.ReadAllText(@"C:\Program Files (x86)\Proga\Settings"); Оно ведёт себя иначе: в режиме отладки при запуске как "Release", данные считываются действительные, при запуске как "Debug" - с учётом изменений. При запуске скомпилированного exe - во всех случаях реальные данные. Может кто знает, что за аномалия такая? Она меня с ума сводит! ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2016, 18:03 |
|
Некорректная работа с файлом
|
|||
---|---|---|---|
#18+
Андрей87, чето имхо не договариваете, если файл лежит под жопой , то у релиза и отладки разные файлы, отсюда и поведение такое. и какой умник будет писать велосипеды, когда есть стандартные сеттинги из коробки, ведут себя к стати также по разному.. и как же вы умудрились инстанс релизной проги в дебаг загнать? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.01.2016, 18:38 |
|
Некорректная работа с файлом
|
|||
---|---|---|---|
#18+
Андрей87, Ваша "магия" скорее всего связана с тем, что пользователь, запустивший программу, не имеет прав на изменение файлов в каталоге "C:\Program Files (x86)\...". И это справедливо не для всех версий Windows (Windows 7+ точно нельзя). Как вам уже посоветовали, лучше использовать стандартные средства для хранения настроек программы. Там есть свои плюсы и минусы, но в большинстве случаев их достаточно. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2016, 08:17 |
|
Некорректная работа с файлом
|
|||
---|---|---|---|
#18+
Где-то в степи, Вы меня, похоже, не поняли. Да и я вас не совсем понимаю. "файл лежит под жопой" - это, Вы, где имеете в виду файл лежит? "у релиза и отладки разные файлы" - файл, с чтением и записью которого проблемы, один, и полный путь к нему "C:\Program Files (x86)\Proga\Settings". И я за 10 лет практики в первый раз сталкиваюсь с тем, что при чтении одного и того же файла, программы выдают разные результаты (кодировка не при чём)! И проблема именно в этом. Судя по всему, где-то что-то кэшируется. Но как и зачем понять не могу. Так как, даже при удалении этого файла, программа продолжает успешно и читать из него и писать в него. То есть только при первой установке программа подтягивает действительные данные из этого файла, а дальше меняет и читает уже что-то другое, хотя обращается всё по тому же пути. "и какой умник будет писать велосипеды, когда есть стандартные сеттинги из коробки" - Вы имеет в виду config-файлы, поддерживаемые средой? Настройки, хранящиеся в "C:\Program Files (x86)\Proga\Settings" задаются в процессе установки программы из дистрибутива. Мне было проще сделать, чтобы дистрибутив создавал новый файл со своими настройками, чем перезаписывал config-файл программы. Но я на 90% уверен, что даже если я и потрачу кучу времени, чтобы переделать инсталятор, и он будет переписывать config-файл, то та же самая проблема повторится и с config-файлом. "и как же вы умудрились инстанс релизной проги в дебаг загнать?" - вот этот вопрос вообще не понял! Есть программа, скомпилирована под "Release", с помощью "Advanced Installer" сделан дистрибутив, который эту программу устанавливает вместе со злосчастным файлом "Settings". Всё. Я никакой "инстанс" ни в какой "дебаг" не "загонял". ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2016, 11:18 |
|
Некорректная работа с файлом
|
|||
---|---|---|---|
#18+
VAlexey, Да, похоже, проблема из-за прав доступа происходит. По крайней мере, если запустить программу от имени администратора, то считывает она реальные данные, а если просто запустить, то какие-то кэшированные. Блин, но почему она просто не выдаёт исключение при попытке читать из этого файла!? А, тем более, при попытке записи в него! Ведь команда File.WriteAllText(@"C:\Program Files (x86)\Proga\Settings", fileTextBuilder.ToString(), Encoding.UTF8); проходит успешно. Только данные хрен знает куда записываются и хрен знает потом от куда считываются. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2016, 11:34 |
|
Некорректная работа с файлом
|
|||
---|---|---|---|
#18+
Где-то в степи, Ну ведь я Вам написал: Вы имеет в виду config-файлы, поддерживаемые средой? Настройки, хранящиеся в "C:\Program Files (x86)\Proga\Settings" задаются в процессе установки программы из дистрибутива. Мне было проще сделать, чтобы дистрибутив создавал новый файл со своими настройками, чем перезаписывал config-файл программы. Но я на 90% уверен, что даже если я и потрачу кучу времени, чтобы переделать инсталятор, и он будет переписывать config-файл, то та же самая проблема повторится и с config-файлом. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2016, 11:38 |
|
Некорректная работа с файлом
|
|||
---|---|---|---|
#18+
Андрей87, ну еще скажите что обфускатором по ней потоптались, и что код вскрыть рефлектором невозможно... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2016, 11:39 |
|
Некорректная работа с файлом
|
|||
---|---|---|---|
#18+
Где-то в степи, вы бы хоть инсталятор выложили, такая интрига создалась что работать уже не вмоготу ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2016, 11:42 |
|
Некорректная работа с файлом
|
|||
---|---|---|---|
#18+
Где-то в степи, Нет, обфускацую не делал. И вскрыть рефлектром можно, конечно Но не пойму к чему это? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2016, 11:43 |
|
Некорректная работа с файлом
|
|||
---|---|---|---|
#18+
Где-то в степи, Согласен, в ближайшее время постараюсь подготовить дистрибутив с простенькой программой, которая просто читает и пишет в этот файл. Реальный дистрибутив не имею права выкладывать :) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2016, 11:47 |
|
Некорректная работа с файлом
|
|||
---|---|---|---|
#18+
Андрей87, Очень просто, если мне не понятно поведение - я смотрю код, а не гадаю на кофейной гуще, да и вообще полезно послушать чужие мысли ( почитать чужой код) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2016, 11:47 |
|
Некорректная работа с файлом
|
|||
---|---|---|---|
#18+
Андрей87, в вашей программе используются типичные settings из коробки, по крайней мере анамнез ( что вы описали) сто процентов на них указывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2016, 11:50 |
|
Некорректная работа с файлом
|
|||
---|---|---|---|
#18+
Где-то в степи, Вы не правы. Программа писал я, и уверяю вас, что это не "типичный settings из коробки". В третий раз напишу: "Settings" создаётся дистрибутивом (его тоже я писал) при установке. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2016, 11:57 |
|
Некорректная работа с файлом
|
|||
---|---|---|---|
#18+
Обычная виртуализация файлов. К сеттингсам отношения не имеет. Ищи записанный файл с настройками в профиле пользователя. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2016, 11:57 |
|
Некорректная работа с файлом
|
|||
---|---|---|---|
#18+
Siemargl, Большое спасибо! Да этот альтернативный файл, с которым работала программа, запущенная не под администратором, нашёлся в директории "AppData\Local\VirtualStore\Program Files (x86)" моей учётной записи. Но почему программа при выполнении команды: File.WriteAllText(@"C:\Program Files (x86)\Proga\Settings", fileTextBuilder.ToString(), Encoding.UTF8); пишет в файл "AppData\Local\VirtualStore\Program Files (x86)\Settings"; а потом при выполнении команды: File.ReadAllText(@"C:\Program Files (x86)\Proga\Settings"); читает из файла "AppData\Local\VirtualStore\Program Files (x86)\Settings"; я не пойму! ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2016, 13:30 |
|
Некорректная работа с файлом
|
|||
---|---|---|---|
#18+
Андрей87Siemargl, Большое спасибо! Да этот альтернативный файл, с которым работала программа, запущенная не под администратором, нашёлся в директории "AppData\Local\VirtualStore\Program Files (x86)" моей учётной записи. Но почему программа при выполнении команды: File.WriteAllText(@"C:\Program Files (x86)\Proga\Settings", fileTextBuilder.ToString(), Encoding.UTF8); пишет в файл "AppData\Local\VirtualStore\Program Files (x86)\Settings"; а потом при выполнении команды: File.ReadAllText(@"C:\Program Files (x86)\Proga\Settings"); читает из файла "AppData\Local\VirtualStore\Program Files (x86)\Settings"; я не пойму! https://support.microsoft.com/en-us/kb/927387, раздел More information. Вкратце - операционная система обеспечивает такую работу. Скорее всего сделано для обеспечения совместимости приложений, которые писались во времена "до UAC". ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2016, 18:40 |
|
Некорректная работа с файлом
|
|||
---|---|---|---|
#18+
Учебник Алексей Федоров Обеспечение совместимости приложений в Microsoft® Windows Vista® и Windows® 7 Руководство для разработчиков download.microsoft.com/documents/rus/windows/v7dev.pdf ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2016, 20:30 |
|
|
start [/forum/topic.php?fid=20&fpage=68&tid=1400872]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 288ms |
total: | 425ms |
0 / 0 |