在C或fortran中,如何检查目录是在本地磁盘上还是在远程磁盘上?

在C或fortran中,如何检查目录是在本地磁盘上还是在远程磁盘上?,c,C,我想在我的C/fortran代码中知道工作目录是主机本地的还是实际远程安装的,例如NFS磁盘?愿意在windows和Linux上都这样做。在windows上的C中,您可能正在寻找windows API函数。要查找当前工作目录,可以使用函数。然而,根据文档,只需调用 GetDriveType为空 如果要检查当前工作目录的驱动器 我不知道Fortran和Linux的等效函数是什么。在Windows上的C中,您可能正在寻找Windows API函数。要查找当前工作目录,可以使用函数。然而,根据文档,只

我想在我的C/fortran代码中知道工作目录是主机本地的还是实际远程安装的,例如NFS磁盘?愿意在windows和Linux上都这样做。

在windows上的C中,您可能正在寻找windows API函数。要查找当前工作目录,可以使用函数。然而,根据文档,只需调用

GetDriveType为空

如果要检查当前工作目录的驱动器


我不知道Fortran和Linux的等效函数是什么。

在Windows上的C中,您可能正在寻找Windows API函数。要查找当前工作目录,可以使用函数。然而,根据文档,只需调用

GetDriveType为空

如果要检查当前工作目录的驱动器

我不知道Fortran和Linux的等效函数是什么。

Linux解决方案

首先,您需要找到安装目录的文件系统

除非要进行路径解析,否则可以从以下位置使用文件系统ID:

概要

以下文件系统类型可能出现在f_类型中:

这对于您的目的可能已经足够了—f_类型的数据可能足以通知您该文件位于本地或远程磁盘上,只要您忽略NFS装载从本地计算机导出的本地文件系统的可能性,以及下面提到的其他问题

对于更具可移植性的解决方案,您可以使用Linux上提供的用于给定路径的文件系统ID:

概要

一旦获得目录的f_fsid值,就需要找到该文件系统的装入点

:

概要

描述

这些例程用于访问文件系统描述文件 /etc/fstab和挂载的文件系统描述文件/etc/mtab

setmntent函数打开文件系统描述文件 文件名,并返回一个可由getmntent使用的文件指针。 参数类型是所需的访问类型,可以采用 与fopen3的mode参数值相同。返回的溪流 应使用endmntent而不是fclose3关闭

getmntent函数读取文件系统的下一行 描述文件,并返回指向结构的指针 包含文件中某行中的断开字段。这个 指针指向内存的静态区域,该区域被 对getmntent的后续调用

addmntent函数将mntent结构mnt添加到 结束 开阔的小溪

endmntent函数关闭与 文件系统描述文件

hasmntopt函数扫描mnt_opts字段,请参见 匹配opt的子字符串的mntent结构mnt。看见 和mount8以获取有效的装载选项

可重入的getmntent_r函数类似于getmntent, 但是 将结构装入存储在提供的*mntbuf中,并存储 提供的 大小为buflen的数组buf

mntent结构定义如下:

       struct statfs {
           __fsword_t f_type;    /* Type of filesystem (see below) */
           __fsword_t f_bsize;   /* Optimal transfer block size */
           fsblkcnt_t f_blocks;  /* Total data blocks in filesystem */
           fsblkcnt_t f_bfree;   /* Free blocks in filesystem */
           fsblkcnt_t f_bavail;  /* Free blocks available to
                                    unprivileged user */
           fsfilcnt_t f_files;   /* Total file nodes in filesystem */
           fsfilcnt_t f_ffree;   /* Free file nodes in filesystem */
           fsid_t     f_fsid;    /* Filesystem ID */
           __fsword_t f_namelen; /* Maximum length of filenames */
           __fsword_t f_frsize;  /* Fragment size (since Linux 2.6) */
           __fsword_t f_flags;   /* Mount flags of filesystem
                                    (since Linux 2.6.36) */
           __fsword_t f_spare[xxx];
                           /* Padding bytes reserved for future use */
       };
       struct statvfs {
           unsigned long  f_bsize;    /* Filesystem block size */
           unsigned long  f_frsize;   /* Fragment size */
           fsblkcnt_t     f_blocks;   /* Size of fs in f_frsize units */
           fsblkcnt_t     f_bfree;    /* Number of free blocks */
           fsblkcnt_t     f_bavail;   /* Number of free blocks for
                                         unprivileged users */
           fsfilcnt_t     f_files;    /* Number of inodes */
           fsfilcnt_t     f_ffree;    /* Number of free inodes */
           fsfilcnt_t     f_favail;   /* Number of free inodes for
                                         unprivileged users */
           unsigned long  f_fsid;     /* Filesystem ID */
           unsigned long  f_flag;     /* Mount flags */
           unsigned long  f_namemax;  /* Maximum filename length */
       };
       struct mntent {
           char *mnt_fsname;   /* name of mounted filesystem */
           char *mnt_dir;      /* filesystem path prefix */
           char *mnt_type;     /* mount type (see mntent.h) */
           char *mnt_opts;     /* mount options (see mntent.h) */
           int   mnt_freq;     /* dump frequency in days */
           int   mnt_passno;   /* pass number on parallel fsck */
       };
有关一些代码示例,请参见

在您的例子中,您可以在struct mntent的mnt_dir字段中保存的路径上调用statfs或statvfs,并获取该文件系统的文件系统ID,当它与您的目录中的文件系统ID匹配时,您就有了挂载点以及文件系统的所有详细信息

您还可以解析文件路径,并在从getmntent返回的挂载文件系统中找到与目录的规范路径匹配的最长mnt_目录。但在这种情况下,您需要处理跨越文件系统边界的软链接。我也不确定到目录的硬链接是否仍然被严格禁止——如果不是的话,使用路径名永远都不可能是确定的

关于环回设备的说明

是将文件装载为文件系统的一种方法。您必须决定是将安装在环回设备上的文件或目录视为本地文件,还是将其追溯到用作环回文件系统的实际文件,并使用该文件确定原始目录是本地还是远程

关于绑定挂载的注意事项

Linux提供了这样的功能,目录可以安装在另一个位置。这是另一种情况,您必须决定是否需要回溯装载以确定原始目录是本地目录还是远程目录。

Linux解决方案

首先,您需要找到安装目录的文件系统

除非要进行路径解析,否则可以从以下位置使用文件系统ID:

概要

以下文件系统类型可能出现在f_类型中:

这可能足以满足您的目的-f_类型的数据可能足以通知您该文件 在本地或远程磁盘上,只要您忽略NFS装载从本地计算机导出的本地文件系统的可能性,以及下面提到的其他问题

对于更具可移植性的解决方案,您可以使用Linux上提供的用于给定路径的文件系统ID:

概要

一旦获得目录的f_fsid值,就需要找到该文件系统的装入点

:

概要

描述

这些例程用于访问文件系统描述文件 /etc/fstab和挂载的文件系统描述文件/etc/mtab

setmntent函数打开文件系统描述文件 文件名,并返回一个可由getmntent使用的文件指针。 参数类型是所需的访问类型,可以采用 与fopen3的mode参数值相同。返回的溪流 应使用endmntent而不是fclose3关闭

getmntent函数读取文件系统的下一行 描述文件,并返回指向结构的指针 包含文件中某行中的断开字段。这个 指针指向内存的静态区域,该区域被 对getmntent的后续调用

addmntent函数将mntent结构mnt添加到 结束 开阔的小溪

endmntent函数关闭与 文件系统描述文件

hasmntopt函数扫描mnt_opts字段,请参见 匹配opt的子字符串的mntent结构mnt。看见 和mount8以获取有效的装载选项

可重入的getmntent_r函数类似于getmntent, 但是 将结构装入存储在提供的*mntbuf中,并存储 提供的 大小为buflen的数组buf

mntent结构定义如下:

       struct statfs {
           __fsword_t f_type;    /* Type of filesystem (see below) */
           __fsword_t f_bsize;   /* Optimal transfer block size */
           fsblkcnt_t f_blocks;  /* Total data blocks in filesystem */
           fsblkcnt_t f_bfree;   /* Free blocks in filesystem */
           fsblkcnt_t f_bavail;  /* Free blocks available to
                                    unprivileged user */
           fsfilcnt_t f_files;   /* Total file nodes in filesystem */
           fsfilcnt_t f_ffree;   /* Free file nodes in filesystem */
           fsid_t     f_fsid;    /* Filesystem ID */
           __fsword_t f_namelen; /* Maximum length of filenames */
           __fsword_t f_frsize;  /* Fragment size (since Linux 2.6) */
           __fsword_t f_flags;   /* Mount flags of filesystem
                                    (since Linux 2.6.36) */
           __fsword_t f_spare[xxx];
                           /* Padding bytes reserved for future use */
       };
       struct statvfs {
           unsigned long  f_bsize;    /* Filesystem block size */
           unsigned long  f_frsize;   /* Fragment size */
           fsblkcnt_t     f_blocks;   /* Size of fs in f_frsize units */
           fsblkcnt_t     f_bfree;    /* Number of free blocks */
           fsblkcnt_t     f_bavail;   /* Number of free blocks for
                                         unprivileged users */
           fsfilcnt_t     f_files;    /* Number of inodes */
           fsfilcnt_t     f_ffree;    /* Number of free inodes */
           fsfilcnt_t     f_favail;   /* Number of free inodes for
                                         unprivileged users */
           unsigned long  f_fsid;     /* Filesystem ID */
           unsigned long  f_flag;     /* Mount flags */
           unsigned long  f_namemax;  /* Maximum filename length */
       };
       struct mntent {
           char *mnt_fsname;   /* name of mounted filesystem */
           char *mnt_dir;      /* filesystem path prefix */
           char *mnt_type;     /* mount type (see mntent.h) */
           char *mnt_opts;     /* mount options (see mntent.h) */
           int   mnt_freq;     /* dump frequency in days */
           int   mnt_passno;   /* pass number on parallel fsck */
       };
有关一些代码示例,请参见

在您的例子中,您可以在struct mntent的mnt_dir字段中保存的路径上调用statfs或statvfs,并获取该文件系统的文件系统ID,当它与您的目录中的文件系统ID匹配时,您就有了挂载点以及文件系统的所有详细信息

您还可以解析文件路径,并在从getmntent返回的挂载文件系统中找到与目录的规范路径匹配的最长mnt_目录。但在这种情况下,您需要处理跨越文件系统边界的软链接。我也不确定到目录的硬链接是否仍然被严格禁止——如果不是的话,使用路径名永远都不可能是确定的

关于环回设备的说明

是将文件装载为文件系统的一种方法。您必须决定是将安装在环回设备上的文件或目录视为本地文件,还是将其追溯到用作环回文件系统的实际文件,并使用该文件确定原始目录是本地还是远程

关于绑定挂载的注意事项


Linux提供了这样的功能,目录可以安装在另一个位置。这是另一种情况,您必须决定是否需要追溯装载以确定原始目录是本地目录还是远程目录。

这不是编程语言的功能,而是操作系统的功能。您可以运行shell命令来执行此操作,这取决于操作系统。@EugeneSh。将初始目录的文件系统ID与所有装入的文件系统的文件系统ID进行比较应该是可行的。并且Linux特定的statfs调用直接提供一个文件系统类型,这可能就足够了。@AndrewHenle您也可以挂载NFS。这会被检测到吗?Upd:是的,statfs看起来不错。对于Linux,您只需读取/proc/mounts并扫描当前目录的开头,即可确定该目录的安装位置。只需在终端中安装cat/proc/即可检查文件。@EugeneSh。提供f_类型,其中NFS_SUPER_MAGIC可能就足够了。不过,我还没有完全测试过它,它不是编程语言的一个特性,而是操作系统的一个特性。您可以运行shell命令来执行此操作,这取决于操作系统。@EugeneSh。将初始目录的文件系统ID与所有装入的文件系统的文件系统ID进行比较应该是可行的。并且Linux特定的statfs调用直接提供一个文件系统类型,这可能就足够了。@AndrewHenle您也可以挂载NFS。这会被检测到吗?Upd:是的,statfs看起来不错。对于Linux,您只需读取/proc/mounts并扫描当前目录的开头,即可确定该目录的安装位置。只需在终端中安装cat/proc/即可检查文件。@EugeneSh。提供f_类型,其中NFS_SUPER_MAGIC可能就足够了。不过,我还没有彻底测试过。
       struct mntent {
           char *mnt_fsname;   /* name of mounted filesystem */
           char *mnt_dir;      /* filesystem path prefix */
           char *mnt_type;     /* mount type (see mntent.h) */
           char *mnt_opts;     /* mount options (see mntent.h) */
           int   mnt_freq;     /* dump frequency in days */
           int   mnt_passno;   /* pass number on parallel fsck */
       };