【问题标题】:CopyFile error code 2复制文件错误代码 2
【发布时间】:2014-09-17 12:30:19
【问题描述】:

我必须创建控制台应用程序,它会在目录中查找所有 .txt 文件,并将它们复制为同一目录中的 .copytxt 格式。程序从 CopyFile 函数返回错误代码 2。我真的不知道问题出在哪里。我尝试使用此参考:http://msdn.microsoft.com/en-us/library/windows/desktop/aa365522(v=vs.85).aspx

这是我的代码:

#include "stdafx.h"
#include "windows.h"


#define SOURCE_PATH _T(R"(C:\Users\XXXXX\Documents\4.semester\PB173\Ukol1\text\)")

int _tmain(int argc, _TCHAR* argv[])
{
WIN32_FIND_DATA findData;
HANDLE findHandle;
BOOL fFinished = FALSE;
TCHAR oldPath[MAX_PATH];
TCHAR newPath[MAX_PATH];
DWORD attrs;

_tcscpy_s(oldPath, _T("\\?\)"));
_tcscpy_s(oldPath, SOURCE_PATH);
_tcscat_s(oldPath, _T("*.txt"));
_tprintf(_T("%s\n"), oldPath);

findHandle = FindFirstFile(oldPath, &findData);
if (findHandle != INVALID_HANDLE_VALUE)
{
    _tprintf(_T("The first file found is %s\n"), findData.cFileName);

    while (!fFinished)
    {
        _tcscpy_s(newPath, _T("\\?\)"));
        _tcscpy_s(newPath, SOURCE_PATH);
        TCHAR* pChar;
        TCHAR* savePtr;
        pChar = _tcstok_s(findData.cFileName, _T("."), &savePtr);
        _tcscat_s(newPath, pChar);
        _tcscat_s(newPath, _T(".copytxt"));
        _tprintf(_T("%s\n"), newPath);

        //StringCchPrintf(newPath, sizeof(newPath) / sizeof(newPath[0]), TEXT("%s\\%s"), oldPath, findData.cFileName);

        if (CopyFile(findData.cFileName, newPath, FALSE))
        {
            attrs = GetFileAttributes(findData.cFileName);
            if (attrs == INVALID_FILE_ATTRIBUTES) break;
            SetFileAttributes(newPath, attrs);

            _tprintf(_T("File %s copied successfully.\n"), findData.cFileName);
        }
        else
        {
            _tprintf(_T("Could not copy file %s.\n"), findData.cFileName);
            _tprintf(_T("%d\n"), GetLastError());

            break;
        }


        if (!FindNextFile(findHandle, &findData))
        {
            if (GetLastError() == ERROR_NO_MORE_FILES)
            {
                _tprintf(_T("All files *.txt were copied.\n"));
                fFinished = TRUE;
            }
            else
            {
                _tprintf(_T("Could not find next file.\n"));
                break;
            }
        }
    }

    FindClose(findHandle);
}
else
{
    _tprintf(TEXT("FindFirstFile failed (%d)\n"), GetLastError());
}

return 0;
}

【问题讨论】:

  • 如果您看到this reference,则错误2ERROR_FILE_NOT_FOUND
  • 2 是 ERROR_FILE_NOT_FOUND。 (来自 WinError.h),findData.cFileName 和 newPath 的值是多少?
  • IIRC,cFileName 只是文件名。如果您不使用源路径添加它,则复制文件将失败:(
  • ..事实上,我会将其提升为答案:)
  • 为什么它在我在这里链接的参考文献中有效?

标签: c++ c windows winapi file-io


【解决方案1】:

在尝试复制文件之前,您需要将 cFileName strcat 到源路径的末尾,否则将找不到文件。

来自 MSDN:

此结构中的 cFileName 字段将不包含路径,即使 在调用 FindFirstFile/FindNextFile 时使用了路径。所以如果你 调用 FindFirstFile("C:\Windows\System32*", &finddata),finddata 可能 包含例如“驱动程序”或“cmd.exe”,但不是 “C:\Windows\System32\drivers”或“C:\Windows\System32\cmd.exe”。

【讨论】:

    【解决方案2】:

    当您想在文字中使用实际的\ 字符时,您需要将\ 转义为\\

    您还将括号字符放在文字值中。您需要删除它们。

    改变

    #define SOURCE_PATH _T(R"(C:\Users\XXXXX\Documents\4.semester\PB173\Ukol1\text\)")
    

    #define SOURCE_PATH _T("C:\\Users\\XXXXX\\Documents\\4.semester\\PB173\\Ukol1\\text\\")
    

    _T("\\?\)")
    

    _T("\\\\?\\")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 2011-08-04
      • 2013-07-05
      • 1970-01-01
      • 2016-10-09
      • 2017-02-06
      相关资源
      最近更新 更多