CopyFile错误代码2

时间:2014-09-17 12:30:19

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

我必须创建控制台应用程序,它在目录中查找所有.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;
}

2 个答案:

答案 0 :(得分:0)

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

来自MSDN:

  

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

答案 1 :(得分:0)

如果您想在文字中使用实际的\字符,则需要将\\作为\转义。

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

更改

#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("\\\\?\\")