2008-09-26 8 views
5

मैं कैसे निर्धारित कर सकता हूं कि रिमोट ड्राइव के पास सी # में .N # का उपयोग करके दी गई फ़ाइल अपलोड करने के लिए पर्याप्त जगह है या नहीं?मैं कैसे निर्धारित कर सकता हूं कि रिमोट ड्राइव में सी # का उपयोग कर फ़ाइल लिखने के लिए पर्याप्त जगह है या नहीं?

+0

दूरस्थ ड्राइव किस प्रकार: नेटवर्क ड्राइव, वेबसाइट, आदि? – Brettski

+0

ध्यान रखें, भले ही आप इसे निर्धारित कर सकें, यह केवल एक पल के लिए सटीक है - यदि आपका उपयोगकर्ता ड्राइव/अन्य प्रक्रियाएं ड्राइव पर लिख रहे हैं तो भी आपका अपलोड विफल हो सकता है। – Shog9

उत्तर

10

दो संभावित समाधान हैं।

  1. Win32 फ़ंक्शन GetDiskFreeSpaceEx पर कॉल करें। यहां एक नमूना कार्यक्रम है:

    internal static class Win32 
    { 
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
        internal static extern bool GetDiskFreeSpaceEx(string drive, out long freeBytesForUser, out long totalBytes, out long freeBytes); 
    
    } 
    
    class Program 
    { 
        static void Main(string[] args) 
        { 
         long freeBytesForUser; 
         long totalBytes; 
         long freeBytes; 
    
         if (Win32.GetDiskFreeSpaceEx(@"\\prime\cargohold", out freeBytesForUser, out totalBytes, out freeBytes)) { 
          Console.WriteLine(freeBytesForUser); 
          Console.WriteLine(totalBytes); 
          Console.WriteLine(freeBytes); 
         } 
        } 
    } 
    
  2. सिस्टम प्रबंधन इंटरफ़ेस का उपयोग करें। इस पोस्ट में एक और जवाब है जो इसका वर्णन करता है। यह विधि वास्तव में पॉवरशेल जैसे स्क्रिप्टिंग भाषाओं में उपयोग के लिए डिज़ाइन की गई है। यह सही ऑब्जेक्ट प्राप्त करने के लिए बहुत अधिक फूहड़ करता है। आखिरकार, मुझे संदेह है कि यह विधि GetDiskFreeSpaceEx को कॉल करने के लिए उबलती है।

कोई भी सी # में कोई गंभीर विंडोज़ विकास कर रहा है, तो शायद कई Win32 फ़ंक्शंस को कॉल करना समाप्त हो जाएगा। .NET Framework में Win32 API का 100% शामिल नहीं है। कोई भी बड़ा प्रोग्राम .NET पुस्तकालयों में अंतराल को उजागर करेगा जो केवल Win32 API के माध्यम से उपलब्ध हैं। मैं .NET के लिए Win32 wrappers में से एक को पकड़ूंगा और इसे अपनी परियोजना में शामिल करूंगा। यह आपको लगभग हर Win32 API के लिए तुरंत पहुंच प्रदान करेगा।

+0

क्या GetDiskFreeSpaceEx नेटवर्क शेयरों के साथ काम करता है? प्रमाणीकरण के बारे में क्या? – FlySwat

+0

कोड गलत है। आपको 'long' के बजाय 'ulong' का उपयोग करना होगा। –

+0

तकनीकी रूप से, हाँ, कोड गलत है, हालांकि यह संकलित करता है क्योंकि DllImport उलझन के बजाए लंबे समय तक उपयोग करता है। यह केवल तब विफल हो जाएगा जब डिस्क 2^63 बाइट्स से बड़ी हो। एक 1 टीबी डिस्क लगभग 2^40 बाइट्स है। हमें विफल होने से पहले ड्राइव को एक्साबाइट ड्राइव करने के लिए पिछले पेटबाइट ड्राइव प्राप्त करना होगा। –

2

क्या आप कंप्यूटर पर लॉजिकल ड्राइव पर नेटवर्क शेयर मैप करने के बारे में बात कर रहे हैं?

यदि ऐसा है तो आप ड्राइवइन्फो का उपयोग कर सकते हैं।

 
    DriveInfo info = new DriveInfo("X:"); 

    info.AvailableFreeSpace; 

DriveInfo केवल इसलिए यदि आप केवल पूर्ण शेयर (यूएनसी) नाम मुझे नहीं लगता कि इसके बाद के संस्करण कोड काम करेंगे है का उपयोग कर रहे तार्किक ड्राइव के साथ काम करता है।

2

मुझे यकीन है कि अगर GetDiskFreeSpaceEx यूएनसी शेयरों पर काम करता है नहीं कर रहा हूँ, लेकिन अगर इसका इस्तेमाल करता है कि, नहीं तो यहाँ कैसे एक logal ड्राइव करने के लिए एक यूएनसी शेयर माउंट करने के लिए है:

संपादित GetDiskFreeSpaceEx यूएनसी शेयरों पर काम करता है , इसका उपयोग करें ... हालांकि, यह कोड केवल हटाने के लिए बहुत अधिक प्रयास था, और यदि आप कभी भी अपने कोड में स्थानीय ड्राइव के रूप में यूएनसी शेयर को माउंट करना चाहते हैं तो आसान है।

public class DriveWrapper 
{      
    [StructLayout(LayoutKind.Sequential)] 
    public struct NETRESOURCEA 
    { 
     public int dwScope; 
     public int dwType; 
     public int dwDisplayType; 
     public int dwUsage; 
     [MarshalAs(UnmanagedType.LPStr)] 
     public string lpLocalName; 
     [MarshalAs(UnmanagedType.LPStr)] 
     public string lpRemoteName; 
     [MarshalAs(UnmanagedType.LPStr)] 
     public string lpComment; 
     [MarshalAs(UnmanagedType.LPStr)] 
     public string lpProvider; 
     public override String ToString() 
     { 
      String str = "LocalName: " + lpLocalName + " RemoteName: " + lpRemoteName 
        + " Comment: " + lpComment + " lpProvider: " + lpProvider; 
      return (str); 
     } 
    } 

    [DllImport("mpr.dll")] 
    public static extern int WNetAddConnection2A(
      [MarshalAs(UnmanagedType.LPArray)] NETRESOURCEA[] lpNetResource, 
      [MarshalAs(UnmanagedType.LPStr)] string lpPassword, 
      [MarshalAs(UnmanagedType.LPStr)] string UserName, 
      int dwFlags);  
    [DllImport("mpr.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)] 
    private static extern int WNetCancelConnection2A(
      [MarshalAs(UnmanagedType.LPStr)] 
     string lpName, 
      int dwFlags, 
      int fForce 
     ); 

    public int GetDriveSpace(string shareName, string userName, string password) 
    { 
     NETRESOURCEA[] n = new NETRESOURCEA[1]; 
     n[0] = new NETRESOURCEA(); 

     n[0].dwScope = 0; 
     n[0].dwType = 0; 
     n[0].dwDisplayType = 0; 
     n[0].dwUsage = 0; 

     n[0].dwType = 1; 

     n[0].lpLocalName = "x:"; 
     n[0].lpRemoteName = shareName; 
     n[0].lpProvider = null; 

     int res = WNetAddConnection2A(n, userName, password, 1); 

     DriveInfo info = new DriveInfo("x:"); 
     int space = info.AvailableFreeSpace; 

     int err = 0; 
     err = WNetCancelConnection2A("x:", 0, 1); 

     return space; 
    } 
} 
5

WMI उपयोग

using System.Management; 

// Get all the network drives (drivetype=4) 
SelectQuery query = new SelectQuery("select Name, VolumeName, FreeSpace from win32_logicaldisk where drivetype=4"); 
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query); 
foreach (ManagementObject drive in searcher.Get()) 
{ 
    string Name = (string)drive["Name"]; 
    string VolumeName = (string)drive["VolumeName"]; 
    UInt64 freeSpace = (UInt64)drive["FreeSpace"]; 
} 

के आधार पर (से चोरी) http://www.dreamincode.net/code/snippet1576.htm