C ++ CreateFile()函数让我很困惑

时间:2017-07-12 00:29:35

标签: c++ winapi

任何人都可以告诉我为什么它不会在Documents文件夹中创建´´´test.bat´´´?我使用HRESULT hr = SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &path);来查找Documents文件夹的路径。然后将\\test.bat添加到其中。当我将CreateFile(filePath,更改为CreateFile(L"Path to documents",时,会创建文件。

#include <iostream>
#include <string>
#include <Windows.h>
#include <fstream>
#include <KnownFolders.h>
#include <wchar.h>
#include <ShlObj.h>
#include <atlstr.h>

using namespace std; 


int main()
{
    char str[] = "@echo off\n echo Hello\n pause";
    DWORD dwBytesToWrite = (DWORD)strlen(str);
    DWORD dwBytesRead;
    char buff[4096];
    PWSTR path = NULL;
    DWORD dwBytesWritten = 0;
    HRESULT hr = SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &path);
    string pathStart = CW2A(path);
    string file = pathStart + "\\test.bat";
    LPCWSTR filePath;
    filePath = (LPCWSTR)file.c_str();
    if (SUCCEEDED(hr))
    {   
        //cout << file << endl;
        HANDLE mFile = CreateFile(filePath, GENERIC_ALL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_HIDDEN, NULL);
        WriteFile(mFile, str, dwBytesToWrite, NULL, NULL);
        if (ReadFile(mFile, buff, 4096, &dwBytesRead, NULL))
        {
            cout << "Succes! Filen er skrevet!" << endl;
        }
        else {
            cout << "Fejl! Filen blev ikke skrevet!" << endl;
        }

    }
    system("pause");
    return 0;

}

2 个答案:

答案 0 :(得分:0)

  1. 您正在替换三个字符(sizeof("\\\\") - 不要忘记空终结符!strlen本来会更接近,但仍然是两个,而不是一个),这意味着\Us
  2. 您只是替换了第一场比赛,因此只会替换第一个\
  3. 无论如何你不应该更换任何东西。请保留原样的斜杠。
  4. 我们在字符串文字中转义反斜杠(并且字符串文字 - 这意味着源代码的部分看起来像"this")以便表明他们自己并没有引入逃脱序列。

答案 1 :(得分:0)

这是create index idx on article_criterias(article_id, "group", option, option_val); 的事情。它解决了这个问题。