【问题标题】:How to get the directory of a file from the full path in C如何从C中的完整路径获取文件的目录
【发布时间】:2014-02-09 08:09:59
【问题描述】:

我正在尝试从我在参数中获得的文件名(比如C:\some\dir\file)动态获取父目录(比如C:\some\dir),并将其放入char*。我已经在char* 中有完整的路径和文件。我将如何在 C 中做到这一点?

我有一些代码,但在我看来都是乱码,我无法理解。我应该如何重做/重写这个?

/* Gets parent directory of file being compiled */
    short SlashesAmount;
    short NamePosition;
    short NameLength;
    char* Pieces[SlashesAmount];
    char* SplitPath;
    short ByteNumber;
    short PieceNumber;
    char* ScriptDir;
    NameLength = strlen(File);

    //Dirty work
    SplitPath = strtok(File, "\");
    do {
        ByteNumber = 0;
        do {
            File[NamePosition] = CurrentPiece[ByteNumber];
            NamePosition++;
        } while(File[NamePosition] != '\n');
        PieceNumber++;
    } while(NamePosition < NameLength);

【问题讨论】:

标签: c string file path


【解决方案1】:

您正在寻找的是dirname(3)。这仅适用于 POSIX。

Windows 替代方案是_splitpath_s

errno_t _splitpath_s(
   const char * path,
   char * drive,
   size_t driveNumberOfElements,
   char * dir,
   size_t dirNumberOfElements,
   char * fname,
   size_t nameNumberOfElements,
   char * ext, 
   size_t extNumberOfElements
);

示例代码(未经测试):

#include <stdlib.h>
const char* path = "C:\\some\\dir\\file";
char dir[256];

_splitpath_s(path,
    NULL, 0,             // Don't need drive
    dir, sizeof(dir),    // Just the directory
    NULL, 0,             // Don't need filename
    NULL, 0);           

【讨论】:

  • 不是 Linux 特有的吗?
  • 天哪,非常感谢。你救了我一场噩梦。
  • 注意:_splitpath_s 这不会返回带有dir 的驱动器。所以上面的示例只会返回\\some\\dir,而不会返回C:\\some\\dir。因此,如果您正在处理可能不在 C 驱动器上的文件,则必须使用 _splitpath_s 获取驱动器和目录,然后使用 _makepath_s 将它们组合起来。
【解决方案2】:

您已经有了文件的完整路径(例如:C:\some\dir\file.txt),只需:
1. 通过 strrchr() 找到最后一个斜线:称为 p
2.从路径的开头复制到p-1(不包括'/')
所以代码看起来像:

char *lastSlash = NULL;
char *parent = NULL;
lastSlash = strrchr(File, '\\'); // you need escape character
parent = strndup(File, strlen(File) - (lastSlash - 1));

【讨论】:

    【解决方案3】:
    int len = strlen(filepath);  
    char* dir = malloc(len + 1);
    strcpy(dir, filepath);
    while (len > 0) {
       len--;
       if (dir[len] == '\\' || dir[len] == '/') {
          dir[len] = '\0';
          break;
       }
    }
    

    【讨论】:

    • 无论您的代码是否有效,您都不会释放您使用 malloc 分配的内存,这是一种不好的做法。内存泄漏不好。
    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。您可以在帮助中心找到更多关于如何写好答案的信息:stackoverflow.com/help/how-to-answer。祝你好运?
    【解决方案4】:

    这是一个获取完整路径和缓冲区的函数。 它会将缓冲区更新为父路径。 检查功能。享受:)

    /*
    Use: Get parent path by full path
    Input: full path, parent buffer
    Output: None
    */
    void getParent(char* path, char* parent)
    {
        int parentLen;
        char* last = strrchr(path, '/');
    
        if (last != NULL) {
    
            parentLen = strlen(path) - strlen(last + 1);
            strncpy(parent, path, parentLen);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-15
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 2011-03-26
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多