বিনামূল্যে ডিস্কের স্থান পান


95

নীচের প্রতিটি ইনপুট দেওয়া, আমি সেই অবস্থানটিতে বিনামূল্যে স্থান পেতে চাই। কিছুটা এইরকম

long GetFreeSpace(string path)

ইনপুটস:

c:

c:\

c:\temp

\\server

\\server\C\storage

সঠিক ডুপ্লিকেট: stackoverflow.com/questions/412632
dtb

52
সদৃশ নয়, স্ট্যাকওভারফ্লো.com/ প্রশ্নস / ৪১২6363২ কেবল ডিস্ক সম্পর্কে জিজ্ঞাসা করে, আমি ইউএনসি পাথ সম্পর্কেও জিজ্ঞাসা করি এবং 412632-তে সমাধানটি তাদের পক্ষে কার্যকর হয় না।
bh213

উত্তর:


68

এটি আমার জন্য কাজ করে ...

using System.IO;

private long GetTotalFreeSpace(string driveName)
{
    foreach (DriveInfo drive in DriveInfo.GetDrives())
    {
        if (drive.IsReady && drive.Name == driveName)
        {
            return drive.TotalFreeSpace;
        }
    }
    return -1;
}

শুভকামনা!


8
drive.TotalFreeSpaceআমার জন্য কাজ করে না তবে drive.AvailableFreeSpaceকরে

16
আমি জানি এই উত্তরটি প্রাচীন, তবে আপনার AvailableFreeSpace@knocte এর কথা হিসাবে সাধারণত ব্যবহার করা উচিত। AvailableFreeSpaceব্যবহারকারীর জন্য আসলে কতটা উপলব্ধ তা তালিকাভুক্ত করে (কোটার কারণে)। TotalFreeSpaceডিস্কে যা আছে তা তালিকাভুক্ত করে, ব্যবহারকারী কী ব্যবহার করতে পারে তা নির্বিঘ্নে।
রায় টি।

আমি @ রাইটির মন্তব্যটিকে সমর্থন করেছিলাম কারণ কেন একজনের অপরটির চেয়ে বেশি সুপারিশ করা হয় তা বোঝাতে তিনি সময় নিয়েছিলেন।
SoCalCoder 21

41

GetDiskFreeSpaceExরিচার্ডওডের লিঙ্ক থেকে ব্যবহার করে কোডিং স্নিপেট ।

// Pinvoke for API function
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetDiskFreeSpaceEx(string lpDirectoryName,
out ulong lpFreeBytesAvailable,
out ulong lpTotalNumberOfBytes,
out ulong lpTotalNumberOfFreeBytes);

public static bool DriveFreeBytes(string folderName, out ulong freespace)
{
    freespace = 0;
    if (string.IsNullOrEmpty(folderName))
    {
        throw new ArgumentNullException("folderName");
    }

    if (!folderName.EndsWith("\\"))
    {
        folderName += '\\';
    }

    ulong free = 0, dummy1 = 0, dummy2 = 0;

    if (GetDiskFreeSpaceEx(folderName, out free, out dummy1, out dummy2))
    {
        freespace = free;
        return true;
    }
    else
    {
        return false;
    }
}

4
আমি বরং এটি শূন্য ফিরে আসতে চাই ... if (!GetDiskFreeSpaceEx(folderName, out free, out total, out dummy)) throw new Win32Exception(Marshal.GetLastWin32Error());। যাইহোক এখানে কোড সন্ধান করা বেশ সুবিধাজনক।
ইউজিন রায়বতসেভ

4
কেবল যাচাই করা হচ্ছে, তবে আমি মনে করি "ক্যামেরার স্টোরেজফিলহেল্পার" এই কোডটি থেকে একটি নিদর্শনটি মূলটি থেকে অনুলিপি-পেস্ট করা হচ্ছে?
অ্যান্ড্রু থেকেন

এটি দিয়ে শেষ করার দরকার নেই "\\"। এটি যে কোনও বিদ্যমান দির পাথ বা এমনকি সঠিক হতে পারে C:। এই কোডটির
অ্যালেক্স পি।

40

ড্রাইভইনফো আপনাকে সেগুলির কয়েকটিতে সহায়তা করবে (তবে এটি ইউএনসি পাথের সাথে কাজ করে না) তবে সত্যিই আমি মনে করি আপনাকে গেটডিস্কফ্রিস্পেসেক্স ব্যবহার করতে হবে । আপনি সম্ভবত ডাব্লুএমআই এর সাথে কিছু কার্যকারিতা অর্জন করতে পারেন। গেটডিস্কফ্রিস্পেসেক্স আপনার সেরা বাটের মতো দেখায়।

সম্ভাবনা রয়েছে আপনার যথাযথভাবে কাজ করতে আপনার পাথগুলি পরিষ্কার করতে হবে।


8
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("  Drive 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);
            }
        }
    }
}
/* 
This code produces output similar to the following:

Drive A:\
  Drive type: Removable
Drive C:\
  Drive type: Fixed
  Volume label: 
  File system: FAT32
  Available space to current user:     4770430976 bytes
  Total available space:               4770430976 bytes
  Total size of drive:                10731683840 bytes 
Drive D:\
  Drive type: Fixed
  Volume label: 
  File system: NTFS
  Available space to current user:    15114977280 bytes
  Total available space:              15114977280 bytes
  Total size of drive:                25958948864 bytes 
Drive E:\
  Drive type: CDRom

The actual output of this code will vary based on machine and the permissions
granted to the user executing it.
*/

4
যদিও এই কোডটি বাস্তবে কোনও সিস্টেমে সমস্ত ড্রাইভের জন্য কাজ করে, এটি মাউন্ট পয়েন্ট এবং জংশন পয়েন্ট এবং শেয়ারগুলির জন্য ওপি'র প্রয়োজনীয়তার দিকে নজর দেয় না ...
অ্যাড্রিয়ান হুম

3

অরক্ষিত:

using System;
using System.Management;

ManagementObject disk = new
ManagementObject("win32_logicaldisk.deviceid="c:"");
disk.Get();
Console.WriteLine("Logical Disk Size = " + disk["Size"] + " bytes");
Console.WriteLine("Logical Disk FreeSpace = " + disk["FreeSpace"] + "
bytes"); 

বিটিডব্লিউ সি: টেম্পে মুক্ত ডিস্কস্পেসের ফলাফল কী? আপনি সি মুক্ত স্থান পাবেন: \


4
কেনি যেমন বলেছেন, যে কোনও ডিরেক্টরিের জন্য মুক্ত স্থান মূল ডিরেক্টরিটি চালনার জন্য মুক্ত স্থানের সমান নয়। অবশ্যই আমার মেশিনে নেই।
ব্যারি কেলি

3

এখানে @ সাশা_গুদ উত্তরের একটি রিফ্যাক্টর এবং সরলিকৃত সংস্করণ দেওয়া হয়েছে:

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetDiskFreeSpaceEx(string lpDirectoryName,
        out ulong lpFreeBytesAvailable,
        out ulong lpTotalNumberOfBytes,
        out ulong lpTotalNumberOfFreeBytes);

    public static ulong GetDiskFreeSpace(string path)
    {
        if (string.IsNullOrEmpty(path))
        {
            throw new ArgumentNullException("path");
        }

        ulong dummy = 0;

        if (!GetDiskFreeSpaceEx(path, out ulong freeSpace, out dummy, out dummy))
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }

        return freeSpace;
    }

আপনার উপায়টি আরও ভাল, আপনি সর্বশেষ উইন্ডো 32 এরর বের করার সময় দিয়েছেন
এডি

3

এটি পরীক্ষা করে দেখুন (এটি আমার জন্য কার্যকর সমাধান)

public long AvailableFreeSpace()
{
    long longAvailableFreeSpace = 0;
    try{
        DriveInfo[] arrayOfDrives = DriveInfo.GetDrives();
        foreach (var d in arrayOfDrives)
        {
            Console.WriteLine("Drive {0}", d.Name);
            Console.WriteLine("  Drive type: {0}", d.DriveType);
            if (d.IsReady == true && d.Name == "/data")
            {
                Console.WriteLine("Volume label: {0}", d.VolumeLabel);
                Console.WriteLine("File system: {0}", d.DriveFormat);
                Console.WriteLine("AvailableFreeSpace for current user:{0, 15} bytes",d.AvailableFreeSpace);
                Console.WriteLine("TotalFreeSpace {0, 15} bytes",d.TotalFreeSpace);
                Console.WriteLine("Total size of drive: {0, 15} bytes \n",d.TotalSize);
                }
                longAvailableFreeSpaceInMB = d.TotalFreeSpace;
        }
    }
    catch(Exception ex){
        ServiceLocator.GetInsightsProvider()?.LogError(ex);
    }
    return longAvailableFreeSpace;
}

2

এই নিবন্ধটি দেখুন !

  1. ":" এর সূচী অনুসন্ধান করে ইউএনসি সমান বা স্থানীয় ড্রাইভের পথ চিহ্নিত করুন

  2. এটি যদি ইউএনসি পথ হয় তবে আপনি ইউএনসি পথের ক্যামের মানচিত্র তৈরি করুন

  3. ড্রাইভের নাম চালানোর কোডটি ম্যাপ করা ড্রাইভের নাম <ইউএনসি ম্যাপড ড্রাইভ বা লোকাল ড্রাইভ>।

    using System.IO;
    
    private long GetTotalFreeSpace(string driveName)
    {
    foreach (DriveInfo drive in DriveInfo.GetDrives())
    {
        if (drive.IsReady && drive.Name == driveName)
        {
            return drive.TotalFreeSpace;
        }
    }
    return -1;
    }
    
  4. আপনার প্রয়োজনীয়তা সম্পন্ন হওয়ার পরে আনম্যাপ করুন।


4
যদিও এই কোডটি আসলে কোনও সিস্টেমে সমস্ত ড্রাইভের জন্য কাজ করে, এটি মাউন্ট পয়েন্ট এবং জংশন পয়েন্টগুলির জন্য ওপি'র প্রয়োজনীয়তার সমাধান করে না ...
অ্যাড্রিয়ান হুম

2

আমি জিবিতে আকারটি খুঁজছিলাম, তাই আমি নিম্নলিখিত পরিবর্তনগুলির সাথে উপরের সুপারম্যানের কোডটি কেবল উন্নত করেছি:

public double GetTotalHDDSize(string driveName)
{
    foreach (DriveInfo drive in DriveInfo.GetDrives())
    {
        if (drive.IsReady && drive.Name == driveName)
        {
            return drive.TotalSize / (1024 * 1024 * 1024);
        }
    }
    return -1;
}

8
আপনি ড্রাইভের মোট ক্ষমতা ফিরিয়ে দিচ্ছেন।
নিক বিনেট

4
আমি ভেবেছিলাম যে যে কেউ জিবি বাইট নিয়ে গণনা করতে পারে, তবে আপনি দেখিয়েছেন যে ভুল অনুমিতি। বিভাগ ব্যবহার করে longতবে ফাংশন রিটার্ন হিসাবে টিস কোডটি ভুল double
কিওয়ারটি 26'16

2

যেমন এই উত্তর এবং @ রিচার্ডওড পরামর্শ দিয়েছেন, আপনার এটি করা উচিত:

[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetDiskFreeSpaceEx(string lpDirectoryName,
   out ulong lpFreeBytesAvailable,
   out ulong lpTotalNumberOfBytes,
   out ulong lpTotalNumberOfFreeBytes);

ulong FreeBytesAvailable;
ulong TotalNumberOfBytes;
ulong TotalNumberOfFreeBytes;

bool success = GetDiskFreeSpaceEx(@"\\mycomputer\myfolder",
                                  out FreeBytesAvailable,
                                  out TotalNumberOfBytes,
                                  out TotalNumberOfFreeBytes);
if(!success)
    throw new System.ComponentModel.Win32Exception();

Console.WriteLine("Free Bytes Available:      {0,15:D}", FreeBytesAvailable);
Console.WriteLine("Total Number Of Bytes:     {0,15:D}", TotalNumberOfBytes);
Console.WriteLine("Total Number Of FreeBytes: {0,15:D}", TotalNumberOfFreeBytes);

1

আমি আমার প্রকল্পের জন্য অনুরূপ পদ্ধতিটি চেয়েছিলাম তবে আমার ক্ষেত্রে ইনপুট পাথগুলি স্থানীয় ডিস্ক ভলিউম বা ক্লাস্টার্ড স্টোরেজ ভলিউম (সিএসভি) থেকে ছিল। সুতরাং ড্রাইভইনফো ক্লাসটি আমার পক্ষে কার্যকর হয়নি। সিএসভিগুলির একটি অন্য ড্রাইভের অধীনে একটি মাউন্ট পয়েন্ট থাকে, সাধারণত সি: us ক্লাস্টারস্টোরেজ \ ভলিউম *। নোট করুন যে সি: সি থেকে আলাদা ভলিউম হবে: us ক্লাস্টারস্টোরেজ \ ভলিউম 1

অবশেষে এটিই আমি এনেছি:

    public static ulong GetFreeSpaceOfPathInBytes(string path)
    {
        if ((new Uri(path)).IsUnc)
        {
            throw new NotImplementedException("Cannot find free space for UNC path " + path);
        }

        ulong freeSpace = 0;
        int prevVolumeNameLength = 0;

        foreach (ManagementObject volume in
                new ManagementObjectSearcher("Select * from Win32_Volume").Get())
        {
            if (UInt32.Parse(volume["DriveType"].ToString()) > 1 &&                             // Is Volume monuted on host
                volume["Name"] != null &&                                                       // Volume has a root directory
                path.StartsWith(volume["Name"].ToString(), StringComparison.OrdinalIgnoreCase)  // Required Path is under Volume's root directory 
                )
            {
                // If multiple volumes have their root directory matching the required path,
                // one with most nested (longest) Volume Name is given preference.
                // Case: CSV volumes monuted under other drive volumes.

                int currVolumeNameLength = volume["Name"].ToString().Length;

                if ((prevVolumeNameLength == 0 || currVolumeNameLength > prevVolumeNameLength) &&
                    volume["FreeSpace"] != null
                    )
                {
                    freeSpace = ulong.Parse(volume["FreeSpace"].ToString());
                    prevVolumeNameLength = volume["Name"].ToString().Length;
                }
            }
        }

        if (prevVolumeNameLength > 0)
        {
            return freeSpace;
        }

        throw new Exception("Could not find Volume Information for path " + path);
    }

1

আপনি এটি চেষ্টা করতে পারেন:

var driveName = "C:\\";
var freeSpace = DriveInfo.GetDrives().Where(x => x.Name == driveName && x.IsReady).FirstOrDefault().TotalFreeSpace;

শুভকামনা


4
এই কোডটি প্রশ্নের উত্তর দিতে পারে, কেন এবং / অথবা এই কোডটির প্রশ্নের উত্তর কীভাবে তার দীর্ঘমেয়াদী মানকে উন্নত করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করে।
জিয়াভি

var driveName = "সি: \\";
নাইম ক্লাউড

-1

আমারও একই সমস্যা ছিল এবং আমি দেখেছিলাম ওয়ারুনা মঞ্জুল সেরা উত্তর দিচ্ছে। তবে কনসোলে এগুলি লিখে রাখাই আপনার পছন্দটি নয়। আল তথ্য বন্ধ করার জন্য নিম্নলিখিত ব্যবহার করুন

প্রথম ধাপ: শুরুতে মানগুলি ঘোষণা করুন

    //drive 1
    public static string drivename = "";
    public static string drivetype = "";
    public static string drivevolumelabel = "";
    public static string drivefilesystem = "";
    public static string driveuseravailablespace = "";
    public static string driveavailablespace = "";
    public static string drivetotalspace = "";

    //drive 2
    public static string drivename2 = "";
    public static string drivetype2 = "";
    public static string drivevolumelabel2 = "";
    public static string drivefilesystem2 = "";
    public static string driveuseravailablespace2 = "";
    public static string driveavailablespace2 = "";
    public static string drivetotalspace2 = "";

    //drive 3
    public static string drivename3 = "";
    public static string drivetype3 = "";
    public static string drivevolumelabel3 = "";
    public static string drivefilesystem3 = "";
    public static string driveuseravailablespace3 = "";
    public static string driveavailablespace3 = "";
    public static string drivetotalspace3 = "";

পদক্ষেপ 2: আসল কোড

                DriveInfo[] allDrives = DriveInfo.GetDrives();
                int drive = 1;
                foreach (DriveInfo d in allDrives)
                {
                    if (drive == 1)
                    {
                        drivename = String.Format("Drive {0}", d.Name);
                        drivetype = String.Format("Drive type: {0}", d.DriveType);
                        if (d.IsReady == true)
                        {
                            drivevolumelabel = String.Format("Volume label: {0}", d.VolumeLabel);
                            drivefilesystem = String.Format("File system: {0}", d.DriveFormat);
                            driveuseravailablespace = String.Format("Available space to current user:{0, 15} bytes", d.AvailableFreeSpace);
                            driveavailablespace = String.Format("Total available space:{0, 15} bytes", d.TotalFreeSpace);
                            drivetotalspace = String.Format("Total size of drive:{0, 15} bytes ", d.TotalSize);
                        }
                        drive = 2;
                    }
                    else if (drive == 2)
                    {
                        drivename2 = String.Format("Drive {0}", d.Name);
                        drivetype2 = String.Format("Drive type: {0}", d.DriveType);
                        if (d.IsReady == true)
                        {
                            drivevolumelabel2 = String.Format("Volume label: {0}", d.VolumeLabel);
                            drivefilesystem2 = String.Format("File system: {0}", d.DriveFormat);
                            driveuseravailablespace2 = String.Format("Available space to current user:{0, 15} bytes", d.AvailableFreeSpace);
                            driveavailablespace2 = String.Format("Total available space:{0, 15} bytes", d.TotalFreeSpace);
                            drivetotalspace2 = String.Format("Total size of drive:{0, 15} bytes ", d.TotalSize);
                        }
                        drive = 3;
                    }
                    else if (drive == 3)
                    {
                        drivename3 = String.Format("Drive {0}", d.Name);
                        drivetype3 = String.Format("Drive type: {0}", d.DriveType);
                        if (d.IsReady == true)
                        {
                            drivevolumelabel3 = String.Format("Volume label: {0}", d.VolumeLabel);
                            drivefilesystem3 = String.Format("File system: {0}", d.DriveFormat);
                            driveuseravailablespace3 = String.Format("Available space to current user:{0, 15} bytes", d.AvailableFreeSpace);
                            driveavailablespace3 = String.Format("Total available space:{0, 15} bytes", d.TotalFreeSpace);
                            drivetotalspace3 = String.Format("Total size of drive:{0, 15} bytes ", d.TotalSize);
                        }
                        drive = 4;
                    }
                    if (drive == 4)
                    {
                        drive = 1;
                    }
                }

                //part 2: possible debug - displays in output

                //drive 1
                Console.WriteLine(drivename);
                Console.WriteLine(drivetype);
                Console.WriteLine(drivevolumelabel);
                Console.WriteLine(drivefilesystem);
                Console.WriteLine(driveuseravailablespace);
                Console.WriteLine(driveavailablespace);
                Console.WriteLine(drivetotalspace);

                //drive 2
                Console.WriteLine(drivename2);
                Console.WriteLine(drivetype2);
                Console.WriteLine(drivevolumelabel2);
                Console.WriteLine(drivefilesystem2);
                Console.WriteLine(driveuseravailablespace2);
                Console.WriteLine(driveavailablespace2);
                Console.WriteLine(drivetotalspace2);

                //drive 3
                Console.WriteLine(drivename3);
                Console.WriteLine(drivetype3);
                Console.WriteLine(drivevolumelabel3);
                Console.WriteLine(drivefilesystem3);
                Console.WriteLine(driveuseravailablespace3);
                Console.WriteLine(driveavailablespace3);
                Console.WriteLine(drivetotalspace3);

আমি নোট করতে চাই যে আপনি কেবল সমস্ত কনসোল রাইটলাইন মন্তব্য কোড তৈরি করতে পারেন, তবে আমি ভেবেছিলাম এটি পরীক্ষা করে নেওয়া আপনার পক্ষে ভাল লাগবে। একে অপরের পরে যদি আপনি এগুলি প্রদর্শন করেন তবে আপনি একই তালিকা পান ওয়ারুনা মাজনা হিসাবে

ড্রাইভ সি: \ ড্রাইভের ধরণ: ফিক্সড ভলিউম লেবেল: ফাইল সিস্টেম: এনটিএফএস বর্তমান ব্যবহারকারীর জন্য উপলভ্য স্থান: 134880153600 বাইট মোট উপলব্ধ স্থান: 134880153600 বাইট ড্রাইভের মোট আকার: 499554185216 বাইট

ড্রাইভ ডি: \ ড্রাইভের ধরণ: সিডিআরম

ড্রাইভ এইচ: \ ড্রাইভের ধরণ: ফিক্সড ভলিউম লেবেল: এইচডিডি ফাইল সিস্টেম: এনটিএফএস বর্তমান ব্যবহারকারীর জন্য উপলব্ধ স্থান: 2000010817536 বাইট মোট উপলব্ধ স্থান: 2000010817536 বাইট ড্রাইভের মোট আকার: 2000263573504 বাইট

তবে আপনি এখন স্ট্রিং এ সমস্ত আলগা তথ্য অ্যাক্সেস করতে পারেন


7
3 টি সিমুলার অবজেক্টের জন্য ক্লাস তৈরি করা এবং অন্য কোনও যদি ব্যবহার না করা হয়। আমি একটু কেঁদেছি।
ম্যাথিজস সেগার্স

4
দুঃখিত বয়লার প্লেটিং কোড, সংগ্রহগুলি ব্যবহার করছেন না এবং একটি স্যুইচ ব্যবহার করছেন না?
অ্যাড্রিয়ান হুম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.