Как проверить наличие каталога в C - PullRequest
0 голосов
/ 05 мая 2020

Я разработал программу, которая представляет собой простой файловый менеджер. Например, он позволяет пользователю создать файл, удалить файл, просмотреть атрибут файлов, изменить каталог и т. Д. c на основе пути CIFS. Однако я обнаружил проблему, когда реализовал команду cd.

Я определил глобальную переменную, которая будет инициализирована новым путем, когда я вызову FmCommandChangeDirectory. Теперь я хотел проверить наличие каталога / папки, прежде чем менять глобальный рабочий путь на новый каталог. Я реализовал следующую функцию, но она не может узнать, существует папка или нет.

bool ChangePathRoot(const char* arg_computer_name)
{
    strcpy_s(g_c_RootDrive, "C:\\");
    strcpy_s(g_c_CurrentPath, "\\\\");
    strcat(g_c_CurrentPath, arg_computer_name);

    strcpy_s(g_c_ShareName, "\\C$");
    strcat(g_c_CurrentPath, g_c_ShareName);

    strcpy_s(g_c_SystemModifiablePath, "\\");
    strcat(g_c_CurrentPath, g_c_SystemModifiablePath);
    return true;
}

void ChangePathReverseBack(const char* arg_computer_name)
{
    char c_PathBuffer[_MAX_PATH];
    char c_Drive[_MAX_DRIVE];
    char c_DirectoryMain[_MAX_DIR], c_DirectoryTemp[_MAX_DIR];
    char c_Filename[_MAX_FNAME];
    char c_Extension[_MAX_EXT];

    strcpy(c_PathBuffer, g_c_CurrentPath);

    _splitpath(c_PathBuffer, c_Drive, c_DirectoryMain, c_Filename, c_Extension);
    _splitpath(c_PathBuffer, c_Drive, c_DirectoryTemp, c_Filename, c_Extension);

    char* c_MainToken = strtok(c_DirectoryMain, "\\");
    int i_StringsCounter = 0;

    while (c_MainToken != NULL)
    {
        c_MainToken = strtok(NULL, "\\");
        i_StringsCounter++;
    }

    char* c_TempToken = strtok(c_DirectoryTemp, "\\");
    int i_StringsCounterTemp = i_StringsCounter - 1;

    char c_FinalModifiedPath[MAX_PATH];
    strcpy(c_FinalModifiedPath, "\\\\");

    for (size_t i = 0; i < i_StringsCounterTemp; i++)
    {
        strcat(c_FinalModifiedPath, c_TempToken);
        strcat(c_FinalModifiedPath, "\\");
        c_TempToken = strtok(NULL, "\\");
    }

    char* c_TokenBase = NULL;
    char* c_TokenDir = NULL;
    c_TokenBase = strtok_s(c_FinalModifiedPath, "\\", &c_TokenDir);

    char* c_TokenRoot = NULL;
    char* c_TokenDirectory = NULL;
    c_TokenRoot = strtok_s(c_TokenDir, "$", &c_TokenDirectory);
    ChangePathSecondary(c_TokenRoot, arg_computer_name, c_TokenDirectory);
}

bool ChangePathRelative(const char* arg_directory)
{
    strcat(g_c_SystemModifiablePath, arg_directory);
    strcat(g_c_SystemModifiablePath, "\\");

    strcat(g_c_CurrentPath, arg_directory);
    strcat(g_c_CurrentPath, "\\");

    return true;
}

void FmCommandChangeDirectory(const char* arg_computer_name)
{
    char c_PathBuffer[_MAX_PATH];
    char c_Drive[_MAX_DRIVE];
    char c_DirectoryMain[_MAX_DIR];
    char c_Filename[_MAX_FNAME];
    char c_Extension[_MAX_EXT];

    scanf_s("%s", c_PathBuffer, MAX_PATH - 1);
    _splitpath(c_PathBuffer, c_Drive, c_DirectoryMain, c_Filename, c_Extension);

    if (!strcmp(c_PathBuffer, "\\") || !strcmp(c_PathBuffer, "/"))
    {
        ChangePathRoot(arg_computer_name);
    }
    else if (!strcmp(c_PathBuffer, ".."))
    {
        ChangePathReverseBack(arg_computer_name);
    }
    else
    {
        ChangePathRelative(c_PathBuffer);
    }
}

Теперь я хотел реализовать функцию, которая проверяет существующий путь (каталог) или нет, но я не знаю, как я могу реализовать такую ​​функцию, чтобы проверить, существует ли каталог или нет.

1 Ответ

1 голос
/ 06 мая 2020

Есть два API, которые вы можете использовать:

В дополнение к GetFileAttributes , упомянутому @IInspectable, вы также можете ссылаться на PathFileExists .

GetFileAttributes:

Извлекает атрибуты файловой системы для указанного файла или каталога.

Код:

DWORD dwAttrib = GetFileAttributes(directorypath);

if(dwAttrib != INVALID_FILE_ATTRIBUTES &&(dwAttrib & FILE_ATTRIBUTE_DIRECTORY))
{
  //exist
}
else
{
  //not a vaild path
}

PathFileExists:

Определяет, действителен ли путь к объекту файловой системы, например файлу или папке.

Код:

BOOL retval = PathFileExists(directorypath);
if(retval == 1)
{
 //file exists
}    
else
{
 //not a vaild file
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...