Проверьте, реален ли файл или символьная ссылка

Да (str.empty() == (str == "")) всегда* верен для std::string. Но помните, что string может содержать '\0' символы. Таким образом даже при том, что выражение s == "" может быть ложью, s.c_str() может все еще возвратить пустую струну до. Например:

#include <string>
#include <iostream>
using namespace std;

void test( const string & s ) {
    bool bempty = s.empty();
    bool beq = std::operator==(s, ""); // avoid global namespace operator==
    const char * res = (bempty == beq ) ? "PASS" : "FAIL";
    const char * isempty = bempty ? "    empty " : "NOT empty ";
    const char * iseq = beq ? "    == \"\"" : "NOT == \"\"";
    cout << res << " size=" << s.size();
    cout << " c_str=\"" << s.c_str() << "\" ";
    cout << isempty << iseq << endl;
}

int main() {
    string s;          test(s); // PASS size=0 c_str=""     empty     == ""
    s.push_back('\0'); test(s); // PASS size=1 c_str="" NOT empty NOT == ""
    s.push_back('x');  test(s); // PASS size=2 c_str="" NOT empty NOT == ""
    s.push_back('\0'); test(s); // PASS size=3 c_str="" NOT empty NOT == ""
    s.push_back('y');  test(s); // PASS size=4 c_str="" NOT empty NOT == ""
    return 0;
}

** запрет перегрузки operator== в глобальном пространстве имен, как другие упомянули*

27
задан mattdwen 28 September 2009 в 02:36
поделиться

2 ответа

GetFileInformationByHandle заполняет структуру BY_HANDLE_FILE_INFORMATION , которая имеет поле dwFileAttributes , где биты устанавливаются с информацией об атрибутах файла (подробности здесь ). В частности, посмотрите на бит маски ...:

FILE_ATTRIBUTE_REPARSE_POINT 1024 0x0400

Файл или каталог, имеющий связанная точка повторной обработки или файл это символическая ссылка.

0
ответ дан 28 November 2019 в 04:46
поделиться

Согласно этот ответ на вопрос о переполнении стека Узнайте, является ли файл символической ссылкой в ​​PowerShell , получив System.IO.FileAttributes для файл (через File.GetAttributes ), и тестирование для бита ReparsePoint работает. Если бит установлен, это символическая ссылка или точка соединения. Если нет, то это обычный файл (или жесткая ссылка).

1
ответ дан 28 November 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: