Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可移植可执行文件的保存位置_C++_Windows - Fatal编程技术网

C++ 可移植可执行文件的保存位置

C++ 可移植可执行文件的保存位置,c++,windows,C++,Windows,我想将我的可移植可执行文件作为单个exe文件提供 此exe文件需要一些txt文件来保存日志。但我不希望用户无意中删除它 在Windows操作系统上不需要administrative权限的情况下,通过可执行文件保存此类文件的标准方法在哪里 可移植可执行文件也可以在不需要管理权限的情况下运行 是否建议通过便携式可执行文件写入用户系统?防病毒软件会对此抱怨吗?对于32位程序,可执行文件应该安装在“C:\Program Files”或“C:\Program Files(x86)”中。此安装需要管理员访问

我想将我的
可移植可执行文件
作为单个
exe
文件提供

exe文件需要一些
txt
文件来保存
日志。但我不希望用户无意中删除它

Windows
操作系统上不需要
administrative
权限的情况下,通过可执行文件保存此类文件的标准方法在哪里

可移植可执行文件也可以在不需要管理权限的情况下运行


是否建议通过便携式可执行文件写入用户系统?防病毒软件会对此抱怨吗?

对于32位程序,可执行文件应该安装在
“C:\Program Files”
“C:\Program Files(x86)”
中。此安装需要管理员访问权限

或者您可以安装到
“c:\Users\UserName\AppData\Local”
目录(或任何其他不受保护的目录,如
“c:\My Programs”
),无需管理员权限,但这是非常规范的

日志文件和其他可写文件无法转到受保护的ProgramFiles目录。它们应该位于
“c:\Users\UserName\AppData\Local”

用户文件必须位于文档目录中

不要忘记程序必须允许用户卸载它。将卸载信息添加到注册表项

"c:\\Program Files\\MyCompany\\MyAppName\\app.exe"
"c:\\Users\\UserName\\AppData\\Local\\MyCompany\\MyAppName\\app.exe"

HKEY_LOCAL_MACHINE //or use HKEY_CURRENT_USER if there is no admin access
    "software\\microsoft\\windows\\currentversion\\uninstall\\My App Name"
        "UninstallString = full-path-uninstall-command"
卸载字符串通常添加到
HKEY\U LOCAL\u计算机
,但如果安装程序没有管理员权限,则可以转到
HKEY\U CURRENT\u用户

要在Vista或更高版本中获取这些文件夹,请使用:

std::wstring documents, appData, programFiles;

wchar_t *ptr;
if (S_OK == SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &ptr))
{
    documents = ptr;
    CoTaskMemFree(ptr);
}

if (S_OK == SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &ptr))
{
    appData = ptr;
    CoTaskMemFree(ptr);
}

if (S_OK == SHGetKnownFolderPath(FOLDERID_ProgramFilesX86, 0, NULL, &ptr))
{
    programFiles = ptr;
    CoTaskMemFree(ptr);
}

在你成为一名保姆程序员之前,你只能保护你的用户这么多。我不认为这是对时间的建设性利用,而且它对于堆栈溢出来说太广泛了。有些文件和文件夹无法写入。我要求一个合适的和标准的文件夹来写。“保姆”是什么意思?标准位置在“用户文档”文件夹中的某个位置。有windows API可以获取位置。保姆部分试图防止他们意外删除文件。SingleExe:检查链接器选项以使用静态库而不是动态库(DLL)。日志放在哪里?GetTempPath(()&请慎重考虑,不要填满硬盘。另一个选项是使用Windows事件日志()大多数用户甚至不知道它的存在。顺便说一句:大多数应用程序只是将其所有文件放在自己的目录中。谢谢Barmak。这是可移植的可执行文件。因此用户下载它,并且通常在下载文件夹中运行它。那么我是否应该将所有额外文件保存在
c:\users\UserName\AppData\Local
?可执行文件是否也应该复制它本身到AppDataLocal文件夹?是的,不要忘记创建一个子目录,例如“c:\Users\UserName\AppData\Local\MyAppName”。您的单机版*.exe应该进行数字签名,否则WindowVista或更高版本将阻止它。这是如何安装的?您使用的是安装程序吗?通过internet?不,它不是实际安装的。只需双击运行。它不是数字签名的。Windows会发出警告,但如果用户单击“确定”以获取警告,则可以使用它。只需添加一些“添加”用户系统中的传统文件,这样他们就不会意外删除它。您可能应该将包放在zip文件中,允许用户在需要的地方下载和解压包,然后将其留在那里。用户只有在信任您的情况下才会下载未签名的包,您应该以同样的礼貌回应。包括readme.txt文件,让用户可以使用现在正在复制其他文件。好的,谢谢。将添加一个ReadMe.txt