.Net Core Temukan Ruang Disk Kosong di OS Berbeda

Apakah ada cara untuk menemukan ruang kosong di OS yang berbeda (Kebanyakan Linux & Windows) menggunakan C# ASP.NET Core.

Saya menemukan cara (menggunakan DriveInfo) untuk mendapatkan ruang kosong dengan meneruskan Nama Drive sebagai parameter. Ini berfungsi dengan baik di Windows, tetapi saya juga menginginkan hal yang sama untuk Linux.

public static int CheckDiskSpace(string driveLetter)
{
    DriveInfo drive = new DriveInfo(driveLetter);

    var totalBytes = drive.TotalSize;
    var freeBytes = drive.AvailableFreeSpace;

    var freePercent = (int)((100 * freeBytes) / totalBytes);

    return freePercent;
}

Melewati Drive (C:/) seperti di bawah ini:

var freespace = DriveDetails.CheckDiskSpace("C:/");

Pembaruan: Ini juga berfungsi untuk Linux.


person Dot Net Dev    schedule 17.07.2018    source sumber
comment
Anda mengetahui bahwa kode Anda, yang dijalankan sebagai bagian dari aplikasi ASP.NET Core, berjalan di server dan bukan di klien, bukan? Jadi Anda akan selalu mendapatkan informasi yang sama, yaitu ruang disk server   -  person Camilo Terevinto    schedule 18.07.2018
comment
Judul pertanyaan saya telah diubah, saya perlu mencari ruang disk kosong untuk aplikasi pada OS yang berbeda   -  person Dot Net Dev    schedule 18.07.2018
comment
@ johnny5 Duplikat itu bahkan tidak mendekati apa yang ditanyakan di sini. OP menginginkan jalur aplikasi yang sedang berjalan, bukan kode sumbernya. Editannya kurang tepat   -  person Camilo Terevinto    schedule 18.07.2018
comment
Kesalahan saya, tetapi judul saat ini menyesatkan, pertanyaan ini terkait dengan menemukan jalur dan bukan ruang disk   -  person johnny 5    schedule 18.07.2018
comment
@ johnny5, menemukan jalur adalah bagian dari pertanyaan, pertanyaan utamanya adalah menemukan ruang disk.   -  person Dot Net Dev    schedule 18.07.2018
comment
Dot Net Dev, Anda bilang Anda sudah menemukan cara menggunakan info drive, bukankah pertanyaan ini lebih berkaitan dengan mendapatkan jalurnya?   -  person johnny 5    schedule 18.07.2018
comment
@ johnny5 Saya menemukan caranya di Windows. Saya ingin sesuatu yang berfungsi untuk Windows, Linux.   -  person Dot Net Dev    schedule 18.07.2018


Jawaban (2)


Untuk Net.Core di Linux Anda cukup menelepon

var freeBytes = new DriveInfo(path).AvailableFreeSpace; 

di mana jalur adalah nama folder relatif atau absolut, dan secara otomatis memberi Anda informasi drive tentang partisi yang menyimpan jalur ini. Diuji pada Net.Core 2.2.

Sebaliknya, di Windows Anda:

A) Perlu memberikan huruf drive (yang sayangnya tidak dapat diturunkan langsung dari jalur relatif, jadi Anda perlu melakukan beberapa pekerjaan tambahan, dan tidak dapat dihitung untuk jalur UNC sama sekali).

B) Perlu menggunakan Windows API (ini juga berfungsi dengan jalur UNC):

[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);

GetDiskFreeSpaceEx(path, out var freeBytes, out var _, out var __);

Ada juga beberapa kasus luar biasa lainnya sehingga pada akhirnya penggunaan saya terlihat seperti berikut:

#if DEBUG        
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetDiskFreeSpaceEx(string lpDirectoryName,
    out long lpFreeBytesAvailable,
    out long lpTotalNumberOfBytes,
    out long lpTotalNumberOfFreeBytes);
#endif

public long? CheckDiskSpace()
{
    long? freeBytes = null;

    try     
    {
#if DEBUG //RuntimeInformation and OSPlatform seem to not exist while building for Linux platform
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
        {
            long freeBytesOut;
            //On some drives (for example, RAM drives, GetDiskFreeSpaceEx does not work
            if (GetDiskFreeSpaceEx(_path, out freeBytesOut, out var _, out var __))
                freeBytes = freeBytesOut;
        }
#endif

        if (freeBytes == null)
        {
            //DriveInfo works well on paths in Linux    //TODO: what about Mac?
            var drive = new DriveInfo(_path);
            freeBytes = drive.AvailableFreeSpace;
        }
    }
    catch (ArgumentException)
    {
        //ignore the exception
    }

    return freeBytes;
}
person Roland Pihlakas    schedule 18.07.2020

Anda dapat menggunakan System.AppContext.BaseDirectory jika Anda menggunakan .Net Core

(OR)

Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)
person Rahul    schedule 17.07.2018