Não é uma duplicata, o stackoverflow.com/questions/412632 só pergunta sobre discos, eu também pergunto sobre caminhos UNC e a solução em 412632 não funciona para eles.
bh213
Respostas:
67
isso funciona para mim ...
using System.IO;privatelongGetTotalFreeSpace(string driveName){foreach(DriveInfo drive inDriveInfo.GetDrives()){if(drive.IsReady&& drive.Name== driveName){return drive.TotalFreeSpace;}}return-1;}
drive.TotalFreeSpacenão funciona para mim, mas drive.AvailableFreeSpacefunciona
knocte
16
Eu sei que essa resposta é antiga, mas geralmente você precisa usar AvailableFreeSpacecomo @knocte diz. AvailableFreeSpacelista quanto está realmente disponível para o usuário (devido ao quotos). TotalFreeSpacelista o que está disponível no disco, independentemente do que o usuário pode usar.
Roy T.
Votei positivamente no comentário de @RoyT porque ele teve tempo para explicar por que um é recomendado em vez do outro.
SoCalCoder
40
DriveInfo irá ajudá-lo com alguns deles (mas não funciona com caminhos UNC), mas realmente acho que você precisará usar GetDiskFreeSpaceEx . Você provavelmente pode obter alguma funcionalidade com o WMI. GetDiskFreeSpaceEx parece ser sua melhor aposta.
Provavelmente, você terá que limpar seus caminhos para que funcione corretamente.
Eu prefiro que ele retorne vazio, como ... if (!GetDiskFreeSpaceEx(folderName, out free, out total, out dummy)) throw new Win32Exception(Marshal.GetLastWin32Error());. De qualquer forma, é muito conveniente encontrar o código aqui.
Eugene Ryabtsev
2
Só estou verificando, mas acho que "CameraStorageFileHelper" é um artefato deste código copiado e colado do original.
Andrew Theken
Não precisa terminar com "\\". Pode ser qualquer caminho dir existente ou mesmo apenas C:. Aqui está minha versão deste código: stackoverflow.com/a/58005966/964478
Alex P.
7
using System;
using System.IO;classTest{publicstaticvoidMain(){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.
*/
Embora este código funcione de fato para todas as unidades em um sistema, ele não atende aos requisitos do OP para pontos de montagem e pontos de junção e compartilhamentos ...
Adrian Hum
3
não testado:
using System;
using System.Management;ManagementObject disk =newManagementObject("win32_logicaldisk.deviceid="c:"");
disk.Get();Console.WriteLine("Logical Disk Size = "+ disk["Size"]+" bytes");Console.WriteLine("Logical Disk FreeSpace = "+ disk["FreeSpace"]+"
bytes");
Btw, qual é o resultado de espaço livre em disco em c: \ temp? você obterá o espaço livre de c: \
Como diz Kenny, o espaço livre para qualquer diretório não é necessariamente o mesmo que o espaço livre para a unidade do diretório raiz. Certamente não está na minha máquina.
Barry Kelly
3
Aqui está uma versão reformulada e simplificada da resposta @sasha_gud:
Embora este código funcione de fato para todas as unidades de um sistema, ele não atende aos requisitos do OP para pontos de montagem e pontos de junção ...
Adrian Hum
2
Eu estava procurando pelo tamanho em GB, então apenas melhorei o código do Superman acima com as seguintes alterações:
Você está devolvendo a capacidade total da unidade.
Nick Binnet
3
Achei que qualquer um pudesse calcular GB com bytes, mas você mostrou que a suposição estava errada. Lste código está errado como a divisão usa, longmas a função retorna double.
Qwertiy
2
Como esta resposta e @RichardOD sugeriram, você deve fazer o seguinte:
[DllImport("kernel32.dll",SetLastError=true,CharSet=CharSet.Auto)][return:MarshalAs(UnmanagedType.Bool)]staticexternboolGetDiskFreeSpaceEx(string lpDirectoryName,outulong lpFreeBytesAvailable,outulong lpTotalNumberOfBytes,outulong lpTotalNumberOfFreeBytes);ulongFreeBytesAvailable;ulongTotalNumberOfBytes;ulongTotalNumberOfFreeBytes;bool success =GetDiskFreeSpaceEx(@"\\mycomputer\myfolder",outFreeBytesAvailable,outTotalNumberOfBytes,outTotalNumberOfFreeBytes);if(!success)thrownewSystem.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);
Eu queria um método semelhante para o meu projeto, mas no meu caso os caminhos de entrada eram de volumes de disco local ou volumes de armazenamento em cluster (CSVs). Portanto, a classe DriveInfo não funcionou para mim. Os CSVs têm um ponto de montagem em outra unidade, normalmente C: \ ClusterStorage \ Volume *. Observe que C: será um volume diferente de C: \ ClusterStorage \ Volume1
Isso é o que eu finalmente descobri:
publicstaticulongGetFreeSpaceOfPathInBytes(string path){if((newUri(path)).IsUnc){thrownewNotImplementedException("Cannot find free space for UNC path "+ path);}ulong freeSpace =0;int prevVolumeNameLength =0;foreach(ManagementObject volume innewManagementObjectSearcher("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;}thrownewException("Could not find Volume Information for path "+ path);}
Embora este código possa responder à pergunta, fornecer contexto adicional sobre por que e / ou como este código responde à pergunta melhora seu valor a longo prazo.
xiawi
var driveName = "C: \\";
Nime Cloud
-1
Eu tive o mesmo problema e vi waruna manjula dando a melhor resposta. No entanto, escrever tudo no console não é o que você pode querer. Para obter as informações da string, use o seguinte
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;}elseif(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;}elseif(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 1Console.WriteLine(drivename);Console.WriteLine(drivetype);Console.WriteLine(drivevolumelabel);Console.WriteLine(drivefilesystem);Console.WriteLine(driveuseravailablespace);Console.WriteLine(driveavailablespace);Console.WriteLine(drivetotalspace);//drive 2Console.WriteLine(drivename2);Console.WriteLine(drivetype2);Console.WriteLine(drivevolumelabel2);Console.WriteLine(drivefilesystem2);Console.WriteLine(driveuseravailablespace2);Console.WriteLine(driveavailablespace2);Console.WriteLine(drivetotalspace2);//drive 3Console.WriteLine(drivename3);Console.WriteLine(drivetype3);Console.WriteLine(drivevolumelabel3);Console.WriteLine(drivefilesystem3);Console.WriteLine(driveuseravailablespace3);Console.WriteLine(driveavailablespace3);Console.WriteLine(drivetotalspace3);
Eu quero observar que você pode apenas fazer todos os códigos de comentário de writelines do console, mas achei que seria bom para você testá-lo. Se você exibir todos estes após o outro, você obterá a mesma lista que waruna majuna
Unidade C: \ Tipo de unidade: Etiqueta de volume fixo: Sistema de arquivos: NTFS Espaço disponível para o usuário atual: 134880153600 bytes Espaço total disponível: 134880153600 bytes Tamanho total da unidade: 499554185216 bytes
Unidade D: \ Tipo de unidade: CDRom
Unidade H: \ Tipo de unidade: Etiqueta de volume fixo: HDD Sistema de arquivo: NTFS Espaço disponível para o usuário atual: 2000010817536 bytes Espaço total disponível: 2000010817536 bytes Tamanho total da unidade: 2000263573504 bytes
No entanto, agora você pode acessar todas as informações soltas nas cordas
Respostas:
isso funciona para mim ...
boa sorte!
fonte
drive.TotalFreeSpace
não funciona para mim, masdrive.AvailableFreeSpace
funcionaAvailableFreeSpace
como @knocte diz.AvailableFreeSpace
lista quanto está realmente disponível para o usuário (devido ao quotos).TotalFreeSpace
lista o que está disponível no disco, independentemente do que o usuário pode usar.DriveInfo irá ajudá-lo com alguns deles (mas não funciona com caminhos UNC), mas realmente acho que você precisará usar GetDiskFreeSpaceEx . Você provavelmente pode obter alguma funcionalidade com o WMI. GetDiskFreeSpaceEx parece ser sua melhor aposta.
Provavelmente, você terá que limpar seus caminhos para que funcione corretamente.
fonte
Trecho de código de trabalho usando o
GetDiskFreeSpaceEx
link de RichardOD.fonte
... if (!GetDiskFreeSpaceEx(folderName, out free, out total, out dummy)) throw new Win32Exception(Marshal.GetLastWin32Error());
. De qualquer forma, é muito conveniente encontrar o código aqui."\\"
. Pode ser qualquer caminho dir existente ou mesmo apenasC:
. Aqui está minha versão deste código: stackoverflow.com/a/58005966/964478fonte
não testado:
Btw, qual é o resultado de espaço livre em disco em c: \ temp? você obterá o espaço livre de c: \
fonte
Aqui está uma versão reformulada e simplificada da resposta @sasha_gud:
fonte
Verifique isto (esta é uma solução funcional para mim)
fonte
veja este artigo !
identificar o par UNC ou o caminho da unidade local pesquisando o índice de ":"
se for UNC PATH, você pode mapear o caminho UNC
o código para executar o nome da unidade é o nome da unidade mapeada <Unidade mapeada UNC ou Unidade local>.
desmapear após a conclusão do requisito.
fonte
Eu estava procurando pelo tamanho em GB, então apenas melhorei o código do Superman acima com as seguintes alterações:
fonte
long
mas a função retornadouble
.Como esta resposta e @RichardOD sugeriram, você deve fazer o seguinte:
fonte
Eu queria um método semelhante para o meu projeto, mas no meu caso os caminhos de entrada eram de volumes de disco local ou volumes de armazenamento em cluster (CSVs). Portanto, a classe DriveInfo não funcionou para mim. Os CSVs têm um ponto de montagem em outra unidade, normalmente C: \ ClusterStorage \ Volume *. Observe que C: será um volume diferente de C: \ ClusterStorage \ Volume1
Isso é o que eu finalmente descobri:
fonte
Você pode tentar isto:
Boa sorte
fonte
Eu tive o mesmo problema e vi waruna manjula dando a melhor resposta. No entanto, escrever tudo no console não é o que você pode querer. Para obter as informações da string, use o seguinte
Etapa um: declarar valores no início
Etapa 2: código real
Eu quero observar que você pode apenas fazer todos os códigos de comentário de writelines do console, mas achei que seria bom para você testá-lo. Se você exibir todos estes após o outro, você obterá a mesma lista que waruna majuna
Unidade C: \ Tipo de unidade: Etiqueta de volume fixo: Sistema de arquivos: NTFS Espaço disponível para o usuário atual: 134880153600 bytes Espaço total disponível: 134880153600 bytes Tamanho total da unidade: 499554185216 bytes
Unidade D: \ Tipo de unidade: CDRom
Unidade H: \ Tipo de unidade: Etiqueta de volume fixo: HDD Sistema de arquivo: NTFS Espaço disponível para o usuário atual: 2000010817536 bytes Espaço total disponível: 2000010817536 bytes Tamanho total da unidade: 2000263573504 bytes
No entanto, agora você pode acessar todas as informações soltas nas cordas
fonte