Win7下CreateFile失败 错误提示:r系统找不到指定的文件 本帖最后由 boyanglee 于 2014-02-10 22:31:45 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 OPEN_EXISTING你打开的文件不存在,所以失败了 使用绝对路径或用GetModuleFileName构造出绝对路径 你那个是A.txt.txt,你打开a.txt文件对麽?看看文件的扩展名~ 绝对路径也试过了... 我用两个printf测试了argv的值 还有请看截图 我之前有dir *.txt过 a.txt是存在的相同的代码在xp+vs2010是可以正常使用的MSDN回答如下图所示还是不懂怎么解决 5楼说得对你的文件实际是A.txt.txt,你要打开的是a.txt,当然打不开了。估计是电脑设置为隐藏文件扩展名了,所以你眼睛看到的文件是A.txt 不好意思 文件名弄错了 但是问题还是存在的 我重新上传图片 并把完整的代码贴上来我是实现类似copy命令的用法 #include <Windows.h>#include <stdio.h>#define BUF_SIZE 256//Show error message of GetLastError()void ShowSystemError();int main(int argc, LPTSTR argv[]){ HANDLE hIn, hOut; DWORD nIn, nOut; CHAR buffer[BUF_SIZE]; if (argc != 3) { printf("Usage: cpw file1 file2\n"); return 1; } printf("%s\n", argv[1]); printf("%s\n", argv[2]); hIn = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hIn == INVALID_HANDLE_VALUE) { printf("Cannot open input file. Error: %x\n", GetLastError()); ShowSystemError(); return 2; } hOut = CreateFile(argv[2], FILE_GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hOut == INVALID_HANDLE_VALUE) { printf("Cannot open input file. Error: %x\n", GetLastError()); CloseHandle(hIn); return 3; } while (ReadFile(hIn, buffer, BUF_SIZE, &nIn, NULL) && nIn > 0) { WriteFile(hOut, buffer, nIn, &nOut, NULL); if (nIn != nOut) { printf("Fatal write error: %x\n", GetLastError()); CloseHandle(hIn); CloseHandle(hOut); return 4; } } CloseHandle(hIn); CloseHandle(hOut); return 0;}//Show error message of GetLastError()void ShowSystemError(){ LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR)&lpMsgBuf, 0, NULL ); MessageBox(NULL, (LPCTSTR)lpMsgBuf, (LPCWSTR)"Error", MB_OK | MB_ICONINFORMATION); LocalFree(lpMsgBuf);} 我在我的机器上试了,没问题,你的D盘下面没有b.txt文件,所以会提示找不到文件! 如果绝对路径还是有问题(还有你看你对话框的标题是乱码)查下命令行参数读取的字符编码跟CreateFile的第一个参数是否匹配,不匹配则转换为一样! 我dir *.txt 是在的啊我想实现 copy a.txt b.txt 这样的功能的 请问你的机器运行环境 我是想实现 copy a.txt b.txt 这样的功能的在当前目录下复制a.txt 为 b.txt 发现是编码问题,从楼上对话框标题乱码得出的灵感。因为我可以创建文件,但是文件名也是乱码,我使用硬编码,将两个CreateFile改为hIn = CreateFile(TEXT("a.txt"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);...hOut = CreateFile(TEXT("b.txt"), FILE_GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);可以正常复制a.txt为b.txt 但是我想反问argv参数啊 VS2013 默认是 Unicode 编码的,你 CreateFile 调用的是 CreateFileW 自然路径就是错误的。你直接用 CreateFileA 就行,argv 就是 ANSI 编码。 帮你简单改了下:int main(int argc, char *argv[]){ HANDLE hIn, hOut; DWORD nIn, nOut; BYTE buffer[BUF_SIZE]; if (argc != 3) { printf("Usage: cpw file1 file2\n"); return 1; } printf("%s\n", argv[1]); printf("%s\n", argv[2]); hIn = CreateFileA(argv[1], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hIn == INVALID_HANDLE_VALUE) { printf("Cannot open input file. Error: %x\n", GetLastError()); ShowSystemError(); return 2; } hOut = CreateFileA(argv[2], FILE_GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hOut == INVALID_HANDLE_VALUE) { printf("Cannot open input file. Error: %x\n", GetLastError()); CloseHandle(hIn); return 3; } while (ReadFile(hIn, (LPVOID)buffer, BUF_SIZE, &nIn, NULL) && nIn > 0) { WriteFile(hOut, (LPCVOID)buffer, nIn, &nOut, NULL); if (nIn != nOut) { printf("Fatal write error: %x\n", GetLastError()); CloseHandle(hIn); CloseHandle(hOut); return 4; } } CloseHandle(hIn); CloseHandle(hOut); return 0;} //Show error message of GetLastError()void ShowSystemError(){ LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR)&lpMsgBuf, 0, NULL ); MessageBox(NULL, lpMsgBuf, _T("Error"), MB_OK | MB_ICONINFORMATION); LocalFree(lpMsgBuf);} 定制按钮控件的问题 CFile无法处理二进制文件吧? 我想用第一个Dialog界面显示第二个Dialog,然后在第二个Dialog里面加Button命名 MessageBox() 关于画多边形的问题? 請問各位大俠!!!! 鼠标钩子中,用哪个API函数可以得到某一EXE(起动之前)的绝对路径和文件名(此EXE并未启动) 关于一个callback函数怎么用的问题(up也有分) 问大家一个关于资源文件的"幼稚"问题,大家不要打我啊 用bkwin框架 DLG标签建立的一个容器怎么动态的移动这个dlg建立的界面 调用Dll的问题 主窗口大小改变,控件不能正常按窗口大小改变? 无模式对话框无法响应消息
你打开的文件不存在,所以失败了
还是不懂怎么解决
估计是电脑设置为隐藏文件扩展名了,所以你眼睛看到的文件是A.txt
不好意思 文件名弄错了 但是问题还是存在的 我重新上传图片 并把完整的代码贴上来我是实现类似copy命令的用法
#include <stdio.h>
#define BUF_SIZE 256//Show error message of GetLastError()
void ShowSystemError();int main(int argc, LPTSTR argv[])
{
HANDLE hIn, hOut;
DWORD nIn, nOut;
CHAR buffer[BUF_SIZE]; if (argc != 3)
{
printf("Usage: cpw file1 file2\n");
return 1;
} printf("%s\n", argv[1]);
printf("%s\n", argv[2]); hIn = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hIn == INVALID_HANDLE_VALUE)
{
printf("Cannot open input file. Error: %x\n", GetLastError());
ShowSystemError();
return 2;
} hOut = CreateFile(argv[2], FILE_GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hOut == INVALID_HANDLE_VALUE)
{
printf("Cannot open input file. Error: %x\n", GetLastError());
CloseHandle(hIn);
return 3;
} while (ReadFile(hIn, buffer, BUF_SIZE, &nIn, NULL) && nIn > 0)
{
WriteFile(hOut, buffer, nIn, &nOut, NULL);
if (nIn != nOut)
{
printf("Fatal write error: %x\n", GetLastError());
CloseHandle(hIn);
CloseHandle(hOut);
return 4;
}
} CloseHandle(hIn);
CloseHandle(hOut); return 0;
}//Show error message of GetLastError()
void ShowSystemError()
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR)&lpMsgBuf,
0,
NULL
);
MessageBox(NULL, (LPCTSTR)lpMsgBuf, (LPCWSTR)"Error", MB_OK | MB_ICONINFORMATION);
LocalFree(lpMsgBuf);
}
查下命令行参数读取的字符编码跟CreateFile的第一个参数是否匹配,不匹配则转换为一样!
请问你的机器运行环境 我是想实现 copy a.txt b.txt 这样的功能的在当前目录下复制a.txt 为 b.txt
因为我可以创建文件,但是文件名也是乱码,我使用硬编码,将两个CreateFile改为
hIn = CreateFile(TEXT("a.txt"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
...
hOut = CreateFile(TEXT("b.txt"), FILE_GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
可以正常复制a.txt为b.txt 但是我想反问argv参数啊
int main(int argc, char *argv[])
{
HANDLE hIn, hOut;
DWORD nIn, nOut;
BYTE buffer[BUF_SIZE];
if (argc != 3)
{
printf("Usage: cpw file1 file2\n");
return 1;
}
printf("%s\n", argv[1]);
printf("%s\n", argv[2]);
hIn = CreateFileA(argv[1], GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hIn == INVALID_HANDLE_VALUE)
{
printf("Cannot open input file. Error: %x\n", GetLastError());
ShowSystemError();
return 2;
}
hOut = CreateFileA(argv[2], FILE_GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hOut == INVALID_HANDLE_VALUE)
{
printf("Cannot open input file. Error: %x\n", GetLastError());
CloseHandle(hIn);
return 3;
}
while (ReadFile(hIn, (LPVOID)buffer, BUF_SIZE, &nIn, NULL) && nIn > 0)
{
WriteFile(hOut, (LPCVOID)buffer, nIn, &nOut, NULL);
if (nIn != nOut)
{
printf("Fatal write error: %x\n", GetLastError());
CloseHandle(hIn);
CloseHandle(hOut);
return 4;
}
}
CloseHandle(hIn);
CloseHandle(hOut);
return 0;
}
//Show error message of GetLastError()
void ShowSystemError()
{
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR)&lpMsgBuf,
0,
NULL
);
MessageBox(NULL, lpMsgBuf, _T("Error"), MB_OK | MB_ICONINFORMATION);
LocalFree(lpMsgBuf);
}