“伪造文件”;“存在”;在检查真实文件之后? 我在Linux上已经编程C++了一段时间,但最近搬到了Windows 10计算机。

“伪造文件”;“存在”;在检查真实文件之后? 我在Linux上已经编程C++了一段时间,但最近搬到了Windows 10计算机。,c++,windows,filepath,C++,Windows,Filepath,我设法用w64 mingw设置代码块 我一直在尝试将程序从linux移动到windows,但我在文件名方面遇到了问题。例如,我有代码来检查文件或目录是否存在,以及创建目录。但我得到了奇怪的结果,如果一个文件检查返回为true,那么所有后续的文件检查返回为true。我有示例代码,其中test.txt和testdir是最初不存在的文件和目录,但由程序创建。fail.txt和faildir从来都不存在,但我的程序在创建test.txt和testdir之后声称它们存在。我见过几个关于检查Windows上

我设法用w64 mingw设置代码块

我一直在尝试将程序从linux移动到windows,但我在文件名方面遇到了问题。例如,我有代码来检查文件或目录是否存在,以及创建目录。但我得到了奇怪的结果,如果一个文件检查返回为true,那么所有后续的文件检查返回为true。我有示例代码,其中test.txt和testdir是最初不存在的文件和目录,但由程序创建。fail.txt和faildir从来都不存在,但我的程序在创建test.txt和testdir之后声称它们存在。我见过几个关于检查Windows上是否存在文件的问题,但我从未遇到过这样的行为,我也不确定到底发生了什么。调用GetFileAttributes()时,windows是否无法重新初始化某些内容?还是我错过了一些基本的东西

main.cpp

#include <iostream>
#include <fstream>
#include "../include/FileChecker.h"

int main(){
    FileChecker fc = FileChecker();
    std::cout << "Test Start" << std::endl;

    #ifdef _WIN32
    std::cout << "OS is windows" << std::endl;
    #endif // _WIN32
    std::cout << std::endl;
    std::cout << "Nothing should exist" << std::endl;

    if(fc.file_exists("test.txt")){
        std::cout << "test.txt exists." << std::endl;
    }else{
        std::cout << "test.txt does not exist." << std::endl;
    }
    if(fc.file_exists("fail.txt")){
        std::cout << "fail.txt exists." << std::endl;
    }else{
        std::cout << "fail.txt does not exist." << std::endl;
    }

    if(fc.directory_exists("testdir")){
        std::cout << "Directory testdir exists." << std::endl;
    }else{
        std::cout << "Directory testdir does not exist." << std::endl;
    }
    if(fc.directory_exists("faildir")){
        std::cout << "Directory faildir exists." << std::endl;
    }else{
        std::cout << "Directory faildir does not exist." << std::endl;
    }
    std::cout << std::endl;
    std::cout << "Creating test.txt" << std::endl;
    std::ofstream test("test.txt");
    test << "HELLO" << std::endl;
    test.close();

    std::cout << "Only test.txt should exist" << std::endl;
    if(fc.file_exists("test.txt")){
        std::cout << "test.txt exists." << std::endl;
    }else{
        std::cout << "test.txt does not exist." << std::endl;
    }
    if(fc.file_exists("fail.txt")){
        std::cout << "fail.txt exists." << std::endl;
    }else{
        std::cout << "fail.txt does not exist." << std::endl;
    }
    if(fc.directory_exists("testdir")){
        std::cout << "Directory testdir exists." << std::endl;
    }else{
        std::cout << "Directory testdir does not exist." << std::endl;
    }
    if(fc.directory_exists("faildir")){
        std::cout << "Directory faildir exists." << std::endl;
    }else{
        std::cout << "Directory faildir does not exist." << std::endl;
    }
    std::cout << std::endl;
    std::cout << "Creating directory testdir" << std::endl;
    if(fc.create_directory("testdir")){
        std::cout << "Creation Success" << std::endl;
    }else{
        std::cout << "Creation Failed" << std::endl;
    }

    std::cout << "Only testdir should exist" << std::endl;
        if(fc.directory_exists("testdir")){
        std::cout << "Directory testdir exists." << std::endl;
    }else{
        std::cout << "Directory testdir does not exist." << std::endl;
    }
    if(fc.directory_exists("faildir")){
        std::cout << "Directory faildir exists." << std::endl;
    }else{
        std::cout << "Directory faildir does not exist." << std::endl;
    }

    return 0;
}
#include "../include/FileChecker.h"

FileChecker::FileChecker(){
    //ctor

}


FileChecker::~FileChecker(){
    //dtor

}



#ifdef _WIN32
bool FileChecker::file_exists(std::string filename){
    static LPCTSTR szPath = TEXT(filename.c_str());
    DWORD dwAttrib = GetFileAttributes(szPath);
    return ((dwAttrib != INVALID_FILE_ATTRIBUTES) && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
}
#endif // _WIN32


#ifdef _WIN32
bool FileChecker::directory_exists(std::string dirname){
    static LPCTSTR szPath = TEXT(dirname.c_str());
    DWORD dwAttrib = GetFileAttributes(szPath);
    return ((dwAttrib != INVALID_FILE_ATTRIBUTES) && (dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
}
#endif // _WIN32


#ifdef _WIN32
bool FileChecker::create_directory(std::string dirname){
    static LPCTSTR szPath = TEXT(dirname.c_str());
    return(CreateDirectory(szPath, NULL));
}
#endif // _WIN32
输出

您的代码如下:

bool FileChecker::file_exists(std::string filename){    
    static LPCTSTR szPath = TEXT(filename.c_str());
    DWORD dwAttrib = GetFileAttributes(szPath);
    return ((dwAttrib != INVALID_FILE_ATTRIBUTES) && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
}
文本只是强制转换,它不执行任何类型的转换。改为以下内容:

bool FileChecker::file_exists(std::string filename)
{
    DWORD dwAttrib = GetFileAttributesA(filename.c_str());
    return ((dwAttrib != INVALID_FILE_ATTRIBUTES) && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
}
您的代码在这里:

bool FileChecker::file_exists(std::string filename){    
    static LPCTSTR szPath = TEXT(filename.c_str());
    DWORD dwAttrib = GetFileAttributes(szPath);
    return ((dwAttrib != INVALID_FILE_ATTRIBUTES) && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
}
文本只是强制转换,它不执行任何类型的转换。改为以下内容:

bool FileChecker::file_exists(std::string filename)
{
    DWORD dwAttrib = GetFileAttributesA(filename.c_str());
    return ((dwAttrib != INVALID_FILE_ATTRIBUTES) && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
}

您应该删除函数中的所有
static
关键字

bool FileChecker::file_exists(std::string filename){
static LPCTSTR szPath = TEXT(filename.c_str());  // <--- [*]
DWORD dwAttrib = GetFileAttributes(szPath);
bool FileChecker::file_存在(std::string filename){

static LPCTSTR szPath=TEXT(filename.c_str());//您应该删除函数中的所有
static
关键字

bool FileChecker::file_exists(std::string filename){
static LPCTSTR szPath = TEXT(filename.c_str());  // <--- [*]
DWORD dwAttrib = GetFileAttributes(szPath);
bool FileChecker::file_存在(std::string filename){

static LPCTSTR szPath=TEXT(filename.c_str());//这似乎解决了问题。我从其他stackexchange答案中得到了“static LPCTSTR…”,但他们从未解释过为什么会出现它,所以我一定认为出于某种原因它是必要的。谢谢。这似乎解决了问题。我得到了“static LPCTSTR…”从其他stackexchange答案中,他们从未解释为什么会出现此问题,因此我一定认为出于某种原因有此必要。谢谢。如果我们使用unicode字符串,跳过强制转换会导致问题吗?如果我们使用unicode字符串,跳过强制转换会导致问题吗?