Как получить свободное место на CD или DVD с помощью C #

я пытаюсь получить доступное дисковое пространство CD или DVD, используя DiskInfo Объектные функции, но никогда не удалось. Я понял это CDROM это файловая система только для чтения, каждый бит которой будет считаться выделенным, поэтому, если кто-либо попытается получить доступное пространство на диске с помощью обычных функций, произойдет сбой. Я также пытался использовать wmic api но тоже не получилось.

А вот и мой код:

foreach (var drive in DriveInfo.GetDrives())
{
double freeSpace = drive.TotalFreeSpace;
double totalSpace = drive.TotalSize;
double percentFree = (freeSpace / totalSpace) * 100;
float num = (float)percentFree;

Console.WriteLine("Drive:{0} With {1} % free", drive.Name, num);
Console.WriteLine("Space Remaining:{0}", drive.AvailableFreeSpace);
Console.WriteLine("Percent Free Space:{0}", percentFree);
Console.WriteLine("Space used:{0}", drive.TotalSize);
Console.WriteLine("Type: {0}", drive.DriveType);
}

ниже приведен пример того, что мог бы вернуть любой код C #, который я пробовал.

письмо : C — Всего : 244095 — свободно : 75851 — тип: Исправлена
письмо : E — Всего :НОЛЬ- свободно :НОЛЬ- тип: CDRom

После @kettch а также @Craig Selbert ответ ниже я попробовал другой способ, используя GetDiskFreeSpaceEx функция, но она не работает, вероятно, и вот мой код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;

namespace IMAPIv2
{
public class Burn
{
[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);ImageMaster _imageMaster;

public String burnData(String filesToBurn,String driverIndex,String volumeLabel,String boolColseMedia,String boolEject){
try
{

String[] sep = { "<!>" };
String[] files = filesToBurn.Split(sep, StringSplitOptions.RemoveEmptyEntries);
DriveInfo driver = getSelectedDriver(int.Parse(driverIndex));
Console.WriteLine(driver.Name);
Console.WriteLine(getDirSize(driver.Name));

ulong FreeBytesAvailable;
ulong TotalNumberOfBytes;
ulong TotalNumberOfFreeBytes;

bool success = GetDiskFreeSpaceEx(driver.Name, 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);

_imageMaster = new ImageMaster();
_imageMaster._recorders.SelectedIndex = Convert.ToInt32(driverIndex);
_imageMaster.LoadRecorder();
_imageMaster.totalFilesToBurn = addFilesToBurn(files);
_imageMaster.VolumeLabel = volumeLabel;
_imageMaster.LoadMedia();
_imageMaster.WriteImage(BurnVerificationLevel.Quick, Convert.ToBoolean(boolColseMedia), Convert.ToBoolean(boolEject));
}
catch (Exception e)
{
throw e;
}
String[] res = { "P:Finished" };
return res[0];
}

private long addFilesToBurn(String[] files)
{
long totalSize = 0;
for (int i = 0; i < files.Length; i++)
{
FileAttributes attr = File.GetAttributes(files[i]);
if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
{
_imageMaster.Nodes.Add(new DirectoryNode(files[i]));
}
else
{
_imageMaster.Nodes.Add(new FileNode(files[i]));
totalSize += new FileNode(files[i]).SizeOnDisc;
}
}
return totalSize;

}

private DriveInfo getSelectedDriver(int driverindex)
{
DriveInfo[] df = DriveInfo.GetDrives();
DriveInfo selectedDriver = null;
int index  = 0;
foreach ( DriveInfo d in df){
if (d.DriveType.Equals(DriveType.CDRom)){
if(index == driverindex){
selectedDriver= d;
break;
}
index++;
}
}

if (selectedDriver == null){
if (index == 0)
{
throw new InvalidOperationException("Please make sure you have a working optical drive to continue");
}
else
{
foreach (DriveInfo d in df)
{
if (d.DriveType.Equals(DriveType.CDRom))
{
selectedDriver = d;
break;
}
}
}
}

return selectedDriver;}

private long getDirSize(String dir)
{
long s = 0;
DirectoryInfo df = new DirectoryInfo(dir);
foreach (FileInfo f in df.GetFiles())
{
s += f.Length;
}

foreach (DirectoryInfo d in df.GetDirectories())
{
s += getDirSize(d.FullName);
}

return s;
}

}
}

Выход для этого кода:

E:\
296589891
Free Bytes Available:                    0
Total Number Of Bytes:              309248
Total Number Of Free Bytes:               0

Свободное место на диске всегда возвращается как ноль, однако это не так, как показано на рисунке

Вот

Любая помощь будет оценена, спасибо заранее.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …