2016-01-27 8 views
1

Я пытаюсь использовать File.getTotalSpace() и File.getFreeSpace() на общем ресурсе NAS через UNC с хоста Windows.getTotalSpace() с UNC

Из-за различных ссылок на NAS, свободное/общее пространство будет отличаться в зависимости от конкретной запрашиваемой директории.

Например, в окне DOS:

dir \\nas\level1 

может вернуться 12,234,567 байт бесплатно, но:

dir \\nas\level1\level2\level3 

возвращает 987654321 байт бесплатно.

Стараюсь:

new File("\\\\nas\\level1\\level2\\level3").getFreeSpace(); 

но это возвращает 12,234,567. Похоже, что getFreeSpace() и getTotalSpace() извлекают сообщенное пространство из корня пути (\\ nas, в данном случае), а не из запрошенного уровня.

Если я карту, что UNC путь к букве диска, например .:

net use s: \\nas\level1\level2\level3 

затем

new File("s:").getFreeSpace(); 

возвращает правильное значение. Но мне нужно перебирать пучки UNC-путей, поэтому сопоставление их всех не представляется возможным.

Так как я могу получить бесплатное/общее пространство на основе UNC-ресурса с определенного уровня каталога, который я запрашиваю?

+0

Предложение: попробуйте java.nio [FileStore] (https://docs.oracle.com/javase/7/docs/api/java/nio/file/class-use/FileStore.html). Например, 'Files.getFileStore (Paths.get (« путь к файлу »). ToRealPath()). GetUsableSpace();'. – paulsm4

+0

Спасибо за предложение, но он дал тот же результат. – Joe

ответ

0

Я предполагаю, что вы получили ожидаемое пространство, используемое/свободное пространство, из проводника Windows.

Если это так, вы также можете получить эти же значения программно из WMI.

SUGGESTIONS:

  1. Используйте Java::WMI library or wrapper как jWMI.

  2. Напишите простой скрипт VBScript или PowerShell, затем call your script from Java.

Вот простой PowerShell (.ps1) пример, из приведенной выше ссылке:

$disk = Get-WmiObject Win32_LogicalDisk -ComputerName remotecomputer -Filter "DeviceID='C:'" | 
Foreach-Object {$_.Size,$_.FreeSpace} 

Вот еще один пример:

https://superuser.com/questions/911534/determine-the-size-of-a-network-folder

$startFolder = "\\pmintl.net\rbsdata\SPA_BB01" 

$colItems = (Get-ChildItem $startFolder | Measure-Object -property length -sum) 
"$startFolder -- " + "{0:N2}" -f ($colItems.sum/1MB) + " MB" 

$colItems = (Get-ChildItem $startFolder -recurse | Where-Object {$_.PSIsContainer -eq $True} | Sort-Object) 
foreach ($i in $colItems) 
    { 
     $subFolderItems = (Get-ChildItem $i.FullName | Measure-Object -property length -sum) 
     $i.FullName + " -- " + "{0:N2}" -f ($subFolderItems.sum/1MB) + " MB" 
    } 
+0

Спасибо, я проверю эти варианты. – Joe

+0

Первый скрипт, по-видимому, работает только с физическими или логическими устройствами (буквы дисков) на удаленной машине. Второй выглядит так, что он будет работать для извлечения использованного пространства, но не свободного места или общего пространства. Я что-то упускаю? – Joe