15

.NETアプリから任意のフォルダー内の合計および使用可能なディスク容量を判別する方法を見つけようとしています。フォルダ内の「合計ディスク容量」と「使用可能なディスク容量」とは、「dir」コマンドを実行した場合にこのフォルダが報告する合計ディスク容量と使用可能なディスク容量、つまり、要求が行われているユーザーアカウントを考慮した、そのフォルダーを含む論理ドライブ。

私はC#を使用しています。このメソッドは、(マップされたドライブ文字を介してアクセスするのではなく)UNCパスとして指定されたローカルフォルダーとリモートフォルダーの両方で機能する必要があります。たとえば、次の場合に機能するはずです。

  • C:\ Temp
  • \\ Silken \ Resources \ Temp2

DirectoryInfoオブジェクトから始めていますが、これには関連するディスク領域情報がないようです。DriveInfoクラスは機能しますが、リモートフォルダーでは機能しません。

編集。皆さんとのやり取りの後、リモートフォルダーをローカルドライブとしてマッピングし、DriveInfoを使用してデータを取得し、再度マッピングを解除することを検討しています。このアプローチの問題は、私のアプリが120を超えるフォルダーのデータを1日に数回毎日収集する必要があることです。これが実現可能かどうかはわかりません。

何か案は?ありがとう。

4

9 に答える 9

13

クラスを使用するMSDNからのこのリンクはどうですか?System.IO.DriveInfo

于 2009-11-25T21:18:56.773 に答える
12

UNC パスとドライブで動作するkernel32.dll の GetDiskFreeSpaceExを使用でき ます。必要なのは、DllImport を含めることだけです (例についてはリンクを参照してください)。

于 2010-03-01T12:41:00.250 に答える
4

これはあなたが望んでいるものではないかもしれませんが、私は助けようとしています.これには、ドライブの空き領域を少し安全に消去するというボーナスがあります.

public static string DriveSizeAvailable(string path)
{
    long count = 0;
    byte toWrite = 1;
    try
    {
        using (StreamWriter writer = new StreamWriter(path))
        {
            while (true)
            {
                writer.Write(toWrite);
                count++;
            }
        }
    }
    catch (IOException)
    {                
    }

    return string.Format("There used to be {0} bytes available on drive {1}.", count, path);
}

public static string DriveSizeTotal(string path)
{
    DeleteAllFiles(path);
    int sizeAvailable = GetAvailableSize(path);
    return string.Format("Drive {0} will hold a total of {1} bytes.", path, sizeAvailable);
}
于 2009-11-25T21:43:32.687 に答える
3

実際には C# の例ではありませんが、ヒントが得られる可能性があります。指定されたパスに沿って、ドライブの空き容量と合計容量 (バイト単位) の両方を返す VB.NET 関数です。System.IO.DriveInfo とは異なり、UNC パスでも機能します。

VB.NET:

<DllImport("kernel32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function GetDiskFreeSpaceEx(lpDirectoryName As String, ByRef lpFreeBytesAvailable As ULong, ByRef lpTotalNumberOfBytes As ULong, ByRef lpTotalNumberOfFreeBytes As ULong) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function

Public Shared Function GetDriveSpace(folderName As String, ByRef freespace As ULong, ByRef totalspace As ULong) As Boolean
    If Not String.IsNullOrEmpty(folderName) Then
        If Not folderName.EndsWith("\") Then
            folderName += "\"
        End If

        Dim free As ULong = 0, total As ULong = 0, dummy2 As ULong = 0
        If GetDiskFreeSpaceEx(folderName, free, total, dummy2) Then
            freespace = free
            totalspace = total
            Return True
        End If
    End If
End Function
于 2015-08-11T21:47:41.043 に答える
1

System.IO.DriveInfo は正常に動作します。私は 2 つの別々の Netware サーバーに接続されており、いくつかのドライブがマップされています。

ローカルの C: ドライブは次のとおりです。

Drive C:\
  File type: Fixed
  Volume label: Drive C
  File system: NTFS
  Available space to current user:   158558248960 bytes
  Total available space:             158558248960 bytes
  Total size of drive:               249884004352 bytes 

ネットワーク ドライブの 1 つの出力は次のとおりです。

Drive F:\
  File type: Network
  Volume label: SYS
  File system: NWFS
  Available space to current user:     1840656384 bytes
  Total available space:               1840656384 bytes
  Total size of drive:                 4124475392 bytes 

DriveInfo の MSDN ドキュメントから直接、次のコードを使用しました。

システムを使用する;
System.IO を使用します。

クラス テスト
{
    public static void Main()
    {
        DriveInfo[] allDrives = DriveInfo.GetDrives();

        foreach (allDrives の DriveInfo d)
        {
            Console.WriteLine("ドライブ {0}", d.Name);
            Console.WriteLine(" ファイルの種類: {0}", d.DriveType);
            もし (d.IsReady == true)
            {
                Console.WriteLine(" ボリューム ラベル: {0}", d.VolumeLabel);
                Console.WriteLine(" ファイル システム: {0}", d.DriveFormat);
                Console.WriteLine(
                    " 現在のユーザーが使用できるスペース:{0, 15} バイト",
                    d.AvailableFreeSpace);

                Console.WriteLine(
                    " 利用可能なスペースの合計: {0, 15} バイト",
                    d.TotalFreeSpace);

                Console.WriteLine(
                    " ドライブの合計サイズ: {0, 15} バイト ",
                    d.TotalSize);
            }
        }
    }
}
于 2009-11-25T21:22:02.103 に答える
1

Maksim Sestic は、ローカル パスと UNC パスの両方で機能するため、最良の回答を提供しています。エラー処理を改善するために彼のコードを少し変更し、例を含めました。魅力のように私のために働きます。

あなたが置く必要があります

Imports System.Runtime.InteropServices

コードに追加して、DllImport を認識できるようにします。

変更されたコードは次のとおりです。

<DllImport("kernel32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function GetDiskFreeSpaceEx(lpDirectoryName As String, ByRef lpFreeBytesAvailable As ULong, ByRef lpTotalNumberOfBytes As ULong, ByRef lpTotalNumberOfFreeBytes As ULong) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function

Public Shared Function GetDriveSpace(folderName As String, ByRef freespace As ULong, ByRef totalspace As ULong) As Boolean

Dim free As ULong = 0
Dim total As ULong = 0
Dim dummy2 As ULong = 0

Try

    If Not String.IsNullOrEmpty(folderName) Then

         If Not folderName.EndsWith("\") Then
             folderName += "\"
         End If

         If GetDiskFreeSpaceEx(folderName, free, total, dummy2) Then
             freespace = free
             totalspace = total
             Return True
         End If

     End If

Catch
End Try

    Return False

End Function

次のように呼び出します。

dim totalspace as ulong = 0
dim freespace as ulong = 0
if GetDriveSpace("\\anycomputer\anyshare", freespace, totalspace) then
    'do what you need to do with freespace and totalspace
else
    'some error
end if

フォルダ名は、次のようなローカル ディレクトリにすることもできますdrive:\path\path\...

これはまだ VB.NET にありますが、C# に変換するのに問題はありません。

于 2015-09-14T12:44:22.013 に答える
0

C#ではなく、使用可能なスペースを提供するだけですが、。。。

dir \\server\share | find /i "bytes free"

途中であなたを取得します。私は探しているか同じ解決策を探していますが、特にドライブのマッピングを避けようとしているときは、良い解決策はないようです。

于 2011-04-20T22:03:23.333 に答える
0

これは不可能だと確信しています。Windows エクスプローラーで、UNC ディレクトリのフォルダー プロパティを取得しようとしても、使用可能なスペースに関して何も表示されません。使用済み/使用可能なスペースは、フォルダーではなくドライブの特性であり、UNC 共有は単なるフォルダーとして扱われます。

次のいずれかを行う必要があります:
- ドライブをマップする
- リモート マシンで何かを実行して、ディスク容量を確認します。

また、UNC/Mapped 共有が特定のドライブに関連付けられていない分散ファイル システムなどで問題が発生する可能性があるため、実際には複数のドライブを合計する必要があります。

ユーザー クォータについてはどうでしょうか。ドライブがいっぱいではない可能性がありますが、そのフォルダーへの書き込みに使用しているアカウントが制限に達している可能性があります。

于 2009-11-25T21:35:37.383 に答える