在 Windows 7 中的 c:\program files\myApp\data 中创建文件夹和文件
我有一个旧的 C++ 应用程序,需要修改才能与 Windows 7 一起使用。 问题在于创建一个新文件夹并将文件保存在该文件夹中。该文件夹应创建于
c:\program files\myApp\data\newFolder。
这是我用来创建新文件夹并出现错误的函数:
if(!CreateDirectory(pathSamples,NULL)) //Throw Error
{
DWORD errorcode = GetLastError();
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, errorcode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK);
}
在 XP 中可以使用,但在 Windows 7 中则不行。如果我以管理员身份运行应用程序,则会创建该文件夹,否则会引发“访问被拒绝”错误。
我的问题如下:
是否有一个选项可以更改代码,以便可以在“程序文件”中创建该文件夹,并且可以将文件保存在此文件夹中?
PS我看到此线程已经,但它没有回答我的问题。
谢谢,
伊利亚
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
你已经回答了你自己的问题。您需要成为管理员才能在 Windows 7 中的 Program Files 下进行写入。
应用程序数据位于 Users//AppData 等下的不同区域中...
您始终可以使用注册表来选择写入位置,因此您可以使用旧的XP 上的区域以及 Vista 和 Windows 7 上的新区域。
You have answered your own question. You need to be an administrator to write under Program Files in Windows 7.
Application data goes in a different area under Users//AppData etc...
You can always use the registry to select the location to write, so you can use the old area on XP and the new area on Vista and Windows 7.
由于 Vista 及更高版本下的用户访问权限有限,您不希望尝试将文件放入“程序文件”或任何其他非标准位置。您确实应该使用 SHGetFolderPath 从系统获取正确的位置。
With limited user access under Vista and later you don't want to be trying to put files in "Program Files" or any other non-standard place. You should really be using SHGetFolderPath to obtain the correct location from the system.
正如其他人已经写的那样,%ProgramFiles% 不是存储用户数据的正确位置。正确的解决方案显然是重新设计应用程序,以便它使用不同的存储位置。
作为替代方案,存在一个快速而肮脏的(!)修复:如果应用程序没有清单,则用户帐户控制数据重定向将启动,透明地将对系统区域的写入请求重定向到安全位置用户个人资料。重定向目标为 %LocalAppData%\VirtualStore\Program Files。有关此类内置虚拟化的详细信息,请参见 此处。
因此,您只需从应用程序中删除清单即可完成。
As others already wrote, %ProgramFiles% is not the right place to store user data. The correct solution obviously is to redesign the application so that it uses a different storage location.
As an alternative there exists a quick and dirty (!) fix: If the application does not have a manifest, User Account Control Data Redirection kicks in, transparently redirecting write requests to system areas to a safe place in the user profile. The redirection target is %LocalAppData%\VirtualStore\Program Files. Details about this kind of built-in virtualization can be found here.
So you could be done by simply removing the manifest from your application.
作为 @CashCow 写道:
最好的方法是提升进程(使用 ShellExecute "runas" 或类似命令),然后创建文件夹。
一些
ShellExecute
示例:As @CashCow writes:
Best way to do this is to elevate your process (using
ShellExecute "runas"
or similar), and then create the folder.Some
ShellExecute
examples:看起来在安装程序中设置此文件夹的权限就足够了,现在它可以正常工作了。
谢谢大家的回答!
It looks like it was enough to set permissions for this folder in installer and now it works normally.
Thanks everyone for your answers!