Russian Qt Forum

Qt => Общие вопросы => Тема начата: ManOfOrange от Июль 21, 2014, 09:04



Название: Сохранение файла на диск C
Отправлено: 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


Название: Re: Сохранение файла на диск C
Отправлено: __Heaven__ от Июль 21, 2014, 10:14
Здравствуйте.
Нужно  в свойствах конечного экзешника на вкладке совместимости задать "Запускать программу от имени админа"

источник (http://stackoverflow.com/questions/10802889/run-the-qt-application-as-administrator-on-windows)


Название: Re: Сохранение файла на диск C
Отправлено: Serr500 от Июль 21, 2014, 12:03
А Вам не приходит в голову, что винда не зря не даёт туда записывать? И некорректно действует не винда, а именна Ваша программа?


Название: Re: Сохранение файла на диск C
Отправлено: Bepec от Июль 21, 2014, 12:15
Некорректно ведёт себя винда. Это не системная папка, но из-за "защиты от дурака" почему то требует разрешение на запись.

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


Название: Re: Сохранение файла на диск C
Отправлено: GreatSnake от Июль 21, 2014, 12:32
Некорректно ведёт себя винда. Это не системная папка, но из-за "защиты от дурака" почему то требует разрешение на запись.
Может перед такими заявлениями хотя бы почитать про UAC (http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C_%D1%83%D1%87%D1%91%D1%82%D0%BD%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%B9)?


Название: Re: Сохранение файла на диск C
Отправлено: __Heaven__ от Июль 21, 2014, 12:44
почитал про uac. Это ж получается, что программа может быть с правами администратора либо полностью, либо вообще нет. То есть, нельзя дать админские права на одну функцию, саму функцию нужно выносить в отдельную программу. Я правильно понимаю?


Название: Re: Сохранение файла на диск C
Отправлено: GreatSnake от Июль 21, 2014, 12:57
Работа с контролем учетных записей в приложениях Windows Vista (http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8C_%D1%83%D1%87%D1%91%D1%82%D0%BD%D1%8B%D1%85_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B5%D0%B9_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D0%B5%D0%B9).


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

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

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

почитал про uac. Это ж получается, что программа может быть с правами администратора либо полностью, либо вообще нет. То есть, нельзя дать админские права на одну функцию, саму функцию нужно выносить в отдельную программу. Я правильно понимаю?
Ну, в общем, да. Можно попытаться поиграть внутри с токенами и Security Rights, но овчинка выделки не стоит.


Название: Re: Сохранение файла на диск C
Отправлено: Bepec от Июль 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 весил почти под терабайт. А что в итоге? он использовался под временные файлы конвертера видеофайлов. Соответственно не очищался. Пфф - норма.


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


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

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


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

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

PPS я недавно ах... был сильно удивлён при расчистке чужого компа - каталог users весил почти под терабайт. А что в итоге? он использовался под временные файлы конвертера видеофайлов. Соответственно не очищался. Пфф - норма.
Да уж... А что, про Символьные ссылки (http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0#Windows) не известно?


Название: Re: Сохранение файла на диск C
Отправлено: Bepec от Июль 21, 2014, 14:43
Известно. Собственно первый раз я пытался перенести с помощью их. В результате переноса профиля пользователя начинаются странные баги аля не находит профиль пользователя при загрузке, создаются "неразрушимые" и "запретные" каталоги, которые в обычном профиле программы могут удалять, а по сим линкам пасуют. Начинается мутотень с правами.

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

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

PPS решил проблему с этим поиском аналогов тупых программ. Причём тупизной страдают большие компании. Маленькие предоставляют хотя бы выбор папок при установке. Опенсорс же даёт возможность настроить почти всё :)


Название: Re: Сохранение файла на диск C
Отправлено: kuzulis от Июль 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 - не уверен, что оно поддерживает манифесты).



Название: Re: Сохранение файла на диск C
Отправлено: Bepec от Июль 21, 2014, 23:36
to kuzulis: ключевое слово - хранение настроек :D Телеметрия настройка?

Хранение всей остальной мутотни должно быть реализовано рядом с программой и/или по выбору пользователя.


Название: Re: Сохранение файла на диск C
Отправлено: kuzulis от Июль 21, 2014, 23:53
Цитировать
Телеметрия настройка?

[offtop]
В БД - чем не вариант? :)
[/offtop]


Название: Re: Сохранение файла на диск C
Отправлено: Bepec от Июль 22, 2014, 01:45
Нуу, я пока не встречал БД которая бы 4 гб в секунду принимала и отдавала на чтение записанное :)

Хотя есть мысли что nosql БД могут справиться, но это приведёт к необходимости написания клиентов... Пока что сбрасывать телеметрию в файлы и расшаривать - лучший вариант :)

PS хотя вопрос остаётся в силе - может ли БД справиться с таким потоком данных, приёмом и отдачей и обработкой запросов :)


Название: Re: Сохранение файла на диск C
Отправлено: Serr500 от Июль 22, 2014, 08:04
насчет MinGW - не уверен, что оно поддерживает манифесты
Поддерживает. Только манифест нужно самому писать, автоматически (как в VS) он не генерируется. Пишем манифест, RC-файл и радуемся! Ку!  ;D


Название: Re: Сохранение файла на диск C
Отправлено: Fregloin от Июль 22, 2014, 09:44
Проблема с сохранением в ProgramFiles мне знакома!
Решилась отключением защиты данных для системного диска. Может конечно грубо, но на том компе кроме моей программы ничего не вертится.
На других компах, где уже куча стороннего софта, устанавливаю через инсталлятор, сделанный в InnoSetup (благо бесплатный и вполне удобный).
Интересно, а в QDir есть функции выдающие пути APPData, USerData и CommonUsersData (папки с данными пользователей)? Т.к. по кроссплатформенное,
нужно учитывать пути доступа к файлам.


Название: Re: Сохранение файла на диск C
Отправлено: Serr500 от Июль 22, 2014, 09:54
QDir::home(), QDir::homePath(), класс QStandardPaths (Qt 5.0+)


Название: Re: Сохранение файла на диск C
Отправлено: ManOfOrange от Июль 22, 2014, 13:03
Ого, какая дискуссия.

Я знаю, что использовать Program Files нехорошо, но к сожалению, есть уже готовая программа, под которую нам приходится подстраиваться. И она берёт файлы именно из этой папки( Сейчас пишу письма разработчикам с просьбой исправить положение; если не выйдет, то придётся использовать один из рецептов, предложенных здесь.

Спасибо всем за ответы =)