Russian Qt Forum
Ноябрь 23, 2024, 11:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Сохранение файла на диск C  (Прочитано 12312 раз)
ManOfOrange
Гость
« : Июль 21, 2014, 09:04 »

Здравствуйте!

Возникла необходимость сохранить файл в строго определённую папку в Windows 7/8, которая находится на диске C в Program Files.

Файл пишу так:
Код:
QString inPath = "C:\\Program Files\\Project\\Zadanie\\zad.xml";

QByteArray arrFile;

//Запись данных в arrFile

QFile file(inPath);
file.open(QIODevice::WriteOnly);
file.write(arrFile);

Но при этом файл записывается в папку C:\Users\Имя пользователя\AppData\Local\VirtualStore\Program Files\Project\Zadanie\zad.xml.

Проверил на диске E, там всё в порядке. Поэтому подозреваю, что дело в допуске от имени администратора.

Подскажите, пожалуйста, как сделать корректное сохранение? К сожалению, нет возможности изменить конечную папку, она задана жёстко. Так же нет возможности запустить программу правым кликом и «запуск от имени администратора», ибо вызываться программа должна будет из другого приложения...

Заранее спасибо!

P.S. Windows 7/8, Qt 5.2.0, QtCreator 3.0.0
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Июль 21, 2014, 10:14 »

Здравствуйте.
Нужно  в свойствах конечного экзешника на вкладке совместимости задать "Запускать программу от имени админа"

источник
Записан
Serr500
Гость
« Ответ #2 : Июль 21, 2014, 12:03 »

А Вам не приходит в голову, что винда не зря не даёт туда записывать? И некорректно действует не винда, а именна Ваша программа?
Записан
Bepec
Гость
« Ответ #3 : Июль 21, 2014, 12:15 »

Некорректно ведёт себя винда. Это не системная папка, но из-за "защиты от дурака" почему то требует разрешение на запись.

Serr500 - приведите довод для корректности запрета записи в папке программы?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Июль 21, 2014, 12:32 »

Некорректно ведёт себя винда. Это не системная папка, но из-за "защиты от дурака" почему то требует разрешение на запись.
Может перед такими заявлениями хотя бы почитать про UAC?
Записан

Qt 5.11/4.8.7 (X11/Win)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Июль 21, 2014, 12:44 »

почитал про uac. Это ж получается, что программа может быть с правами администратора либо полностью, либо вообще нет. То есть, нельзя дать админские права на одну функцию, саму функцию нужно выносить в отдельную программу. Я правильно понимаю?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #6 : Июль 21, 2014, 12:57 »

Работа с контролем учетных записей в приложениях Windows Vista.
Записан

Qt 5.11/4.8.7 (X11/Win)
Serr500
Гость
« Ответ #7 : Июль 21, 2014, 13:05 »

Некорректно ведёт себя винда. Это не системная папка, но из-за "защиты от дурака" почему то требует разрешение на запись.
С каких это пор C:\\Program Files\\ стала несистемной папкой?

Serr500 - приведите довод для корректности запрета записи в папке программы?

Это, если хотите, правила хорошего тона и, как Вы верно заметили, защита от дурака и криворукого программера. В папку программы можно писать только инсталляторам. Если программа при своей работе пытается что-то записать в папку программы, то это очень многие считают некорректно написанной программой. Для результатов есть %APPDATA%. Если результат нужен всем пользователям, то есть %ALLUSERSPROFILE%. Программа при работе не должна менять системные файлы и свои бинарники.

почитал про uac. Это ж получается, что программа может быть с правами администратора либо полностью, либо вообще нет. То есть, нельзя дать админские права на одну функцию, саму функцию нужно выносить в отдельную программу. Я правильно понимаю?
Ну, в общем, да. Можно попытаться поиграть внутри с токенами и Security Rights, но овчинка выделки не стоит.
Записан
Bepec
Гость
« Ответ #8 : Июль 21, 2014, 13:27 »

Я в курсе UAC. И тем не менее смысла в ней не вижу.

Папка, в которую устанавливаются "сторонние" программы не должна быть системной. По моему разумению. Да, не спорю - даже перенести эту program files без мозго..... нельзя, она ж системная.

Но программа, которая не может писать в СВОЙ каталог - что это за программа? Куда девать настройки, полученные данные, сохранения, телеметрию? Куда?
Писать в каталог пользователя данные - хорошо для сохранений и настроек юзера. Валить туда всё - плохой тон. (пример приведу в PS).

Но вы правильно пишете
Цитировать
Программа при работе не должна менять системные файлы и свои бинарники.
А вот всё остальное менять она должна... Ну да я уже перечислил.

Собственно использование UAC приводит к тому, что при запуске любой(sic!) программы выскакивает "обожемой, notepad хочет изменять файл ini у себя в каталоге!!!". И в результате 90% отключают этот UAC.

PS собственно пример - у меня стоит в качестве диска "C:\" SSD на 60 Гб. Для ускорения работы и прочего. Вот дурные программы вместо спроса куда ставить и куда сохранять данные, делают как вы говорите - ставят в %programfiles%, а данные ложат в %appdata%. В результате на SSD 0 места. А в качестве винта для данных у меня стоит 2Тб HDD. И туда они даже не суются. Ну а фигли. И настроек в программах нет никаких... Долбо***** в общем.

Перенести каталог program files и users можно конечно, но. Но в результате начинаются проблемы именно с системой - выскакивают ошибки от служб, программ ( не стоит мне писать, что "вы неправильно переносите". ). В результате хаос, херня и анархия в отдельной ОС. И мне думается что ваша точка мнения верна только для конфигурации 1 винчестер и программ, не работающих с большим количеством данных, т.е. для простого пользователя.

PPS я недавно ах... был сильно удивлён при расчистке чужого компа - каталог users весил почти под терабайт. А что в итоге? он использовался под временные файлы конвертера видеофайлов. Соответственно не очищался. Пфф - норма.
« Последнее редактирование: Июль 21, 2014, 13:29 от Bepec » Записан
Serr500
Гость
« Ответ #9 : Июль 21, 2014, 13:35 »

Ширпотреб правит миром... Увы... Главное для современных программеров и фирм - быстро выкатить продукт и хапнуть денежек. А юзер пусть уж сам разгребает завалы мусора на своём компе. Типа, "а чё вы хочете? Наша софтина работает, это у вас диск маловат. Купите новый." Качество программ сейчас даже не на второй план ставится, а вообще не рассматривается. Хомячки всё схавают!
Записан
Pretorean
Гость
« Ответ #10 : Июль 21, 2014, 13:52 »

У вас есть огромный выбор вариантов:
1. Смириться и переделать свой софт в соответствии с гайдлайнами от МС.
2. Устанавливать свое приложение в любой каталог, кроме "Program Files", тогда никто не помешает "срать" в каталог установки.
3. Инициировать повышение привилегий при старте ПО (http://msdn.microsoft.com/en-us/library/bb756929.aspx)

Во всех юниксах изначально была идеология, когда программы отдельно, а пользовательские данные и настройки - отдельно. И опыт показал что это более правильно.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #11 : Июль 21, 2014, 14:03 »

PS собственно пример - у меня стоит в качестве диска "C:\" SSD на 60 Гб. Для ускорения работы и прочего. Вот дурные программы вместо спроса куда ставить и куда сохранять данные, делают как вы говорите - ставят в %programfiles%, а данные ложат в %appdata%. В результате на SSD 0 места. А в качестве винта для данных у меня стоит 2Тб HDD. И туда они даже не суются. Ну а фигли. И настроек в программах нет никаких... Долбо***** в общем.

Перенести каталог program files и users можно конечно, но. Но в результате начинаются проблемы именно с системой - выскакивают ошибки от служб, программ ( не стоит мне писать, что "вы неправильно переносите". ). В результате хаос, херня и анархия в отдельной ОС. И мне думается что ваша точка мнения верна только для конфигурации 1 винчестер и программ, не работающих с большим количеством данных, т.е. для простого пользователя.

PPS я недавно ах... был сильно удивлён при расчистке чужого компа - каталог users весил почти под терабайт. А что в итоге? он использовался под временные файлы конвертера видеофайлов. Соответственно не очищался. Пфф - норма.
Да уж... А что, про Символьные ссылки не известно?
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #12 : Июль 21, 2014, 14:43 »

Известно. Собственно первый раз я пытался перенести с помощью их. В результате переноса профиля пользователя начинаются странные баги аля не находит профиль пользователя при загрузке, создаются "неразрушимые" и "запретные" каталоги, которые в обычном профиле программы могут удалять, а по сим линкам пасуют. Начинается мутотень с правами.

При этом, всё это начинается не сразу. Точнее отследить проблему не смог Улыбающийся Но оно мне надо?

PS собственно в чём проблема - сим линк ладно, он работает. Проблема в системе, где-то что-то не хотит.  

PPS решил проблему с этим поиском аналогов тупых программ. Причём тупизной страдают большие компании. Маленькие предоставляют хотя бы выбор папок при установке. Опенсорс же даёт возможность настроить почти всё Улыбающийся
« Последнее редактирование: Июль 21, 2014, 14:47 от Bepec » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #13 : Июль 21, 2014, 20:31 »

Цитата: Верес
Папка, в которую устанавливаются "сторонние" программы не должна быть системной. По моему разумению. Да, не спорю - даже перенести эту program files без мозго..... нельзя, она ж системная.

Но программа, которая не может писать в СВОЙ каталог - что это за программа? Куда девать настройки, полученные данные, сохранения, телеметрию? Куда?
Писать в каталог пользователя данные - хорошо для сохранений и настроек юзера. Валить туда всё - плохой тон. (пример приведу в PS).

Верес, тут ты не прав. Подмигивающий

Как уже сказали выше, в Windows для хранения всяких настроек есть %APPDATA% (c:\Users\User\AppData\). Куда должна сваливаться конфигурация приложения отдельно для каждого пользователя. Это хороший тон.

Кроме того, никто не запрещает сделать инсталлятор так, чтобы он устанавливал приложение в %APPDATA% вместо %PROGRAMFILES%. Тем самым можно будет без проблем менять бинарики приложения, если уж очень надо.

Кроме того, в Windows - хороший тон - это еще и подписывать свои приложения сертификатом (естествено платненько). Улыбающийся

PS: Аналогично реализуется и в Linux, где весь трешак (настройки приложения и пр.) хранятся в директории пользователя (/home/user), а не в /bin, /usr/bin и прочих..

Цитата: ManOfOrange
Подскажите, пожалуйста, как сделать корректное сохранение? К сожалению, нет возможности изменить конечную папку, она задана жёстко. Так же нет возможности запустить программу правым кликом и «запуск от имени администратора», ибо вызываться программа должна будет из другого приложения...

Для этих целей можно подшаманить с манифестом того приложения, которое будет сохранять что-то в системные файлы. Можно поставить там уровень запуска "только админ", тогда при запуске этого приложения всегда будет запускаться UAC и спрашивать пароль админа. Компилить нужно в VS (насчет MinGW - не уверен, что оно поддерживает манифесты).

« Последнее редактирование: Июль 21, 2014, 20:37 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Bepec
Гость
« Ответ #14 : Июль 21, 2014, 23:36 »

to kuzulis: ключевое слово - хранение настроек Веселый Телеметрия настройка?

Хранение всей остальной мутотни должно быть реализовано рядом с программой и/или по выбору пользователя.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.29 секунд. Запросов: 23.