1

絶対ファイル システム パスが与えられた場合、それが NTFS パーティション上にあるかどうかをどのように検出しますか? 私は C# で手助けしたいと思っていますが、Win32/C で十分です。ソフトウェアが実行されるシステムは、Windows Vista 以降です。

4

5 に答える 5

3
//Get all the drives on the local machine.
DriveInfo[] allDrives = DriveInfo.GetDrives();

//Get the path root.
var pathRoot = Path.GetPathRoot(absoluteFilePath);
//Find the drive based on the path root.
var driveBasedOnPath = allDrives.FirstOrDefault(d => d.RootDirectory.Name == pathRoot);
//Determine if NTFS  
var isNTFS = driveBasedOnPath != null ? driveBasedOnPath.DriveFormat == "NTFS" : false;
于 2012-10-12T21:22:20.643 に答える
2

を使用FSCTL_FILESYSTEM_GET_STATISTICSして、ファイル システムの種類を判別できます。

ここにいくつかのサンプルコードがあります。これがマウント ポイントを適切に処理すること、つまり、ソース ボリュームではなくターゲット ボリュームのタイプを検出することを確認しました。マウント ポイント自体を指定する必要はありませんが (指定できます)、指定するファイルまたはディレクトリが存在している必要があります。

#define _WIN32_WINNT 0x0502

#include <windows.h>

#include <stdio.h>

int wmain(int argc, wchar_t ** argv)
{
    HANDLE h;
    FILESYSTEM_STATISTICS * fs;
    BYTE buffer[32768];
    DWORD dw;

    h = CreateFile(argv[1], 0, 
        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 
        NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);

    if (h == INVALID_HANDLE_VALUE)
    {
        printf("CreateFile: %u\n", GetLastError());
        return 1;
    }

    if (!DeviceIoControl(h, FSCTL_FILESYSTEM_GET_STATISTICS, NULL, 0, buffer, sizeof(buffer), &dw, NULL))
    {
        dw = GetLastError();
        CloseHandle(h);
        printf("DeviceIoControl: %u\n", dw);
        if (dw == ERROR_INVALID_FUNCTION)
        {
            printf("This probably means the specified file or directory is not on an NTFS volume.\n");
            printf("For example, this happens if you specify a file on a CD-ROM.\n");
        }
        return 1;
    }

    CloseHandle(h);

    fs = (FILESYSTEM_STATISTICS *)buffer;
    printf("Filesystem type: %u\n", fs->FileSystemType);

    if (fs->FileSystemType == FILESYSTEM_STATISTICS_TYPE_NTFS)
    {
        printf("The file or directory is on an NTFS volume.\n");
    }
    else
    {
        printf("The file or directory is not on an NTFS volume.\n");
    }
    return 0;
}
于 2012-10-14T21:23:09.757 に答える
1

Win32 GetVolumeInformation() API は、指定されたルート ディレクトリ パスのファイル システムの名前を提供します。

これはシンボリックリンク/結合に従い、そのようなリンクのターゲットに関する情報を返すことに注意してください。

于 2012-10-14T21:41:04.487 に答える
1

あなたはDriveInfoクラスを調べたいと思っています。何かのようなもの:

var drive = DriveInfo.GetDrives().SingleOrDefault(di => di.Name.StartsWith("C"));
Console.WriteLine("C drive: {0}", drive.DriveFormat);

drive.DriveFormatフォーマットが出力されるので、NTFSかどうかを確認できます。

于 2012-10-12T21:23:26.683 に答える
0
using System.Management;

string logDisk= "c:";
string CIMObject = String.Format("win32_LogicalDisk.DeviceId='{0}'", logDisk);
using(ManagementObject mo = new ManagementObject(CIMObject))
{
    mo.Get();
    Console.WriteLine(mo["FileSystem"]);
}
于 2012-10-12T21:27:53.650 に答える