2009-11-25 5 views
15

.NET 응용 프로그램의 임의 폴더에서 총 및 사용 가능한 디스크 공간을 확인하는 방법을 찾으려고합니다. 폴더의 "총 디스크 공간"및 "사용 가능한 디스크 공간"으로 "dir"명령을 수행 한 경우이 폴더가보고하는 전체 및 사용 가능한 디스크 공간, 즉 총 디스크 공간 및 사용 가능한 디스크 공간을 나타냅니다. 요청을 수행하는 사용자 계정을 고려하여 해당 폴더가 포함 된 논리 드라이브.NET에서 총 디스크 여유 공간 찾기

저는 C#을 사용하고 있습니다. 이 방법은 매핑 된 드라이브 문자를 통해 액세스하는 대신 UNC 경로로 제공되는 로컬 및 원격 폴더 모두에서 작동해야합니다. 나는의 DirectoryInfo 개체로 시작하고 \ 온도

  • \\ Silfen \ 자료 \ TEMP2
  • , 그러나 이것은 연관된 디스크가없는 것 같다 :

    • C : 예를 들어, 그것을 작동합니다 공간 정보. DriveInfo 클래스는 작동하지만 원격 폴더에서는 작동하지 않습니다.

      편집. 너희들과 교류 한 후 원격 폴더를 로컬 드라이브로 매핑하고 DriveInfo를 사용하여 데이터를 얻은 다음 다시 매핑 해제하는 것을 고려하고있다. 이 접근 방식의 문제점은 내 앱이 매일 120 번 이상의 폴더에 대한 데이터를 수집해야한다는 것입니다. 이것이 가능할 지 확신하지 못합니다.

      아이디어가 있으십니까? 감사.

    +0

    "폴더의 사용 가능한 디스크 공간"이란 무엇을 의미합니까? – Manu

    +0

    그는 네트워크 드라이브를 매핑 할 때 네트워크 드라이브에 얼마나 많은 여유 공간이 있는지 알고 싶어합니다. – zimmer62

    +0

    명확하게 편집 중 ... – CesarGon

    답변

    11

    System.IO.DriveInfo 클래스를 사용하는 this link from MSDN은 어떻습니까?

    +1

    원래 질문에서 DriveInfo 클래스는 원격 fodlers와 작동하지 않습니다. :-) – CesarGon

    +0

    죄송합니다 CesarGon for my bad! Meh! :(UNC 폴더를 지적 했으니 ... 죄송합니다. – t0mm13b

    +0

    안녕하세요, 문제 없습니다. – CesarGon

    1

    System.IO.DriveInfo는 정상적으로 작동합니다. 두 개의 별도 Netware 서버에 연결되어 있으며 여러 드라이브가 매핑되어 있습니다.

    다음은 로컬 C에 대한의 : 드라이브 :

    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의 문서에서 :

    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 
    

    여기에 네트워크 드라이브 중 하나에 대한 출력입니다 :

     
    using System; 
    using System.IO; 
    
    class Test 
    { 
        public static void Main() 
        { 
         DriveInfo[] allDrives = DriveInfo.GetDrives(); 
    
         foreach (DriveInfo d in allDrives) 
         { 
          Console.WriteLine("Drive {0}", d.Name); 
          Console.WriteLine(" File type: {0}", d.DriveType); 
          if (d.IsReady == true) 
          { 
           Console.WriteLine(" Volume label: {0}", d.VolumeLabel); 
           Console.WriteLine(" File system: {0}", d.DriveFormat); 
           Console.WriteLine(
            " Available space to current user:{0, 15} bytes", 
            d.AvailableFreeSpace); 
    
           Console.WriteLine(
            " Total available space:   {0, 15} bytes", 
            d.TotalFreeSpace); 
    
           Console.WriteLine(
            " Total size of drive:   {0, 15} bytes ", 
            d.TotalSize); 
          } 
         } 
        } 
    } 
    
    +1

    죄송합니다. 내 질문을주의 깊게 읽으십시오. :-) DriveInfo는 원격 폴더에 매핑되어있는 경우에도 로컬 드라이브에서만 작동합니다. 로컬 드라이브로 매핑되지 않은 UNC 경로를 직접 사용할 수있는 방법이 필요합니다. 그래도 고마워. – CesarGon

    +1

    아, 나는 원래 게시물에서 UNC 참조를 놓쳤다. * 좀 더주의 깊게 읽어야합니다. 미안, 시저. –

    +0

    문제는 없습니다. 도움이 항상 감사합니다. :-) – CesarGon

    0

    저는 이것이 불가능하다고 확신합니다. Windows 탐색기에서 UNC 디렉토리의 폴더 속성을 가져 오려고하면 사용할 수있는 공간까지 아무 것도 제공하지 않습니다. 사용/사용 가능한 공간은 폴더가 아닌 드라이브의 특성이며 UNC 공유는 폴더로 취급됩니다.

    는, 당신은에 다음 중 하나
    - 디스크 공간을 확인하는 원격 컴퓨터에서 실행 무언가를 - 드라이브
    에게지도.

    UNC/매핑 된 공유가 특정 드라이브에 연결되어 있지 않은 분산 파일 시스템과 같은 문제가 발생할 수도 있습니다. 따라서 여러 드라이브를 실제로 합산해야합니다.

    그리고 사용자 할당량은 어떻게됩니까? 드라이브가 꽉 찼을 수는 없지만 해당 폴더에 쓰려는 계정이 제한을 초과했을 수 있습니다.

    +1

    고마워요, Neil. 그러나 다시, Vista 머신의 Windows Explorer는 내가 사용하고있는 DFS 폴더에 얼마나 많은 공간이 있는지를 완벽하게 알려줍니다. programmaticaly 같은 일을 할 수있는 방법이 있어야합니다. :-) – CesarGon

    +0

    당신은 얼마나 정확하게 탐색기에서 사용할 수있는 공간을보고 있습니까? –

    +0

    @ Cesar :하지만 XP는 할 수 없습니다. 이전에 게시 한 "등록 정보"를 선택하여 동일한 폴더 (매핑 된 드라이브 대신 UNC 경로)를 마우스 오른쪽 버튼으로 클릭하면 여유 공간 정보가없는 대화 상자에서 "일반"탭 만 표시됩니다. 대신, 다음과 같이 표시됩니다. 유형 : 폴더 대상 : \\ server \ folder, 만든 날짜 : (날짜 및 시간), 설명 : (없음). 그게 전부예요. –

    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); 
    } 
    
    +1

    정말 대단합니다, 제프리. 혹시 플럭스 커패시터가 내장 된 버전이 있습니까? : p – CesarGon

    +0

    +1 한 번에 한 바이트 씩 5TB 드라이브에 대해이 작업이 얼마나 오래 걸릴지 염려합니다. 장난. –

    +1

    +1 스나이더 비행 접근법에 +1! 정말 진보적 인 !! :) – Stewbob

    11

    당신은 UNC-경로 및 드라이브와 함께 작동 GetDiskFreeSpaceEx from kernel32.dll를 사용할 수 있습니다. DllImport를 포함하기 만하면됩니다 (예제 링크 참조).

    +0

    감사. 그것이 내가 한 일입니다. :-) 위의 tommieb75는 3 개월 전에 그것을 제안했습니다! – CesarGon

    +0

    @CesarGon : 제안 된 tommieb75 솔루션은 WMI- 개체 (Windows 관리 정보)를 사용하기 때문에 약간 다릅니다. 결과는 동일하지만 WMI 개체를 쿼리 할 때 다른 보안 설정이 필요합니다. 반면 DllImport는 특정 보안 설정이 필요하므로 현재 환경에 따라 다릅니다. 두 가지 솔루션 모두 효과가 있으며 유효한 결과를 얻을 수 있습니다. 방금 다른 개발자가 대안을보기 위해이 솔루션을 추가했습니다. –

    +0

    tommieb75는 초기 답변에 몇 가지 의견을 추가했습니다. 그의 의견에서 GetDiskFreeSpaceEx()를 사용하여 총 디스크 여유 공간을 확보하는 방법을 명시 적으로 보여주는 페이지에 대한 링크를 추가합니다. 이것이 내가 구현 한 해결책이며, 이것은 몇 달 전에 그의 대답을 받아 들인 해결책입니다. 미안 내가 전에 명확하지 않은 경우. :-) – CesarGon

    -1

    C#이 아니며 사용 가능한 공간 만 제공합니다. . .

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

    은 여러분을 방해하지 않습니다. 나는 찾고있는 중이거나 같은 해결책이지만 멋진 드라이브가 아닌 것 같다. 특히 드라이브 매핑을 피할 때 그렇다.

    1

    몇 년 동안 사용해 본 다른 가능성이 있습니다. 아래 예제는 VBScript이지만 모든 COM 인식 언어에서 작동합니다. GetDrive()은 UNC 공유에서도 작동합니다.

    Dim Tripped 
    Dim Level 
    
    Tripped = False 
    Level = 0 
    
    Sub Read(Entry, Source, SearchText, Minimum, Maximum) 
    
        Dim fso 
        Dim disk 
    
        Set fso = CreateObject("Scripting.FileSystemObject") 
    
        Set disk = fso.GetDrive(Source) 
    
        Level = (disk.AvailableSpace/(1024 * 1024 * 1024)) 
    
        If (CDbl(Level) < CDbl(Minimum)) or (CDbl(Level) > CDbl(Maximum)) Then 
         Tripped = True 
        Else 
         Tripped = False 
        End If 
    
    End Sub 
    
    +0

    다운 투표를 선택해야 의견을 보내주십시오. 그리고, 다시 이것은 ** 오래된 ** 코드입니다. 새로운 기법이 많이 있습니다. – CrazyIvan1974

    +0

    아마 C# 대신 VB에 있기 때문에; 그러나, 나 자신을 downvoting 익명 싫어하기 때문에, 나는 그것을 바닥 zilch에 다시 가져다 upvoted. –

    +0

    이것은 내가 찾고있는 것이 아니지만, 내가 필요로하는 것에 아주 가깝기 때문에 감사합니다. =) – Skotte

    2

    하지 정말 C# 예제하지만 당신에게 힌트를 줄 수 - 지정된 경로를 따라 드라이브의 여유와 전체 공간의 두 금액을 반환하는 VB.NET 기능 (바이트). System.IO.DriveInfo와 달리 UNC 경로에서도 작동합니다.

    VB.NET : 그것은 모두 로컬 및 UNC 경로에서 작동으로

    <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 
    
    1

    막심 Sestic가 가장 좋은 답을 주셨습니다. 더 나은 오류 처리를 위해 코드를 약간 변경했으며 예제를 포함 시켰습니다. 매력처럼 나를 위해 일합니다.

    당신은 같이 DllImport가 인식 할 수 있도록, 코드에

    Imports System.Runtime.InteropServices 
    

    을 넣어해야합니다.

    <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#으로 번역하는 데 문제가 있어서는 안됩니다.

    관련 문제