2012-04-05 3 views
2

Я запускаю программу для отображения информации о всех файлах, хранящихся в папке.Acces denied - получить свойства файла?

Я хочу получить свойства файла (самый важный для меня размер файла, но я хотел бы получить и другие свойства, такие как дата модификации и т. Д.).

Моя проблема в том, что когда я добираюсь до файла, который фактически используется другой программой, я не могу получить BasicFileAtrributtes файла. Я пытался использовать File, URL, RandomFileAcces, но все эти requiese, чтобы открыть файл, и бросить исключение, как:

java.io.FileNotFoundException: C:\pagefile.sys (Access is denied)

Есть ли вариант в Java, чтобы получить эти свойства? Я предпочитаю не использовать какие-либо дополнительные библиотеки, чтобы сохранить небольшой размер приложения.

Приложение основано на java JRE7.

Я использую java.nio.file.SimpleFileVisitor для просмотра всех файлов. Вот фрагмент моего кода, где я получил ошибку:

@Override 
public FileVisitResult visitFileFailed(Path file, IOException exc){ 
    FileInfo temp=new FileInfo(new FileInfo().repairName(file.toString())); 
    temp.isLeaf=true; 
    temp.fName=temp.fName.replace(strIn, ""); 
    File fis=null; 
    try { 
      fis=new File(file.toAbsolutePath().toString()); 
      if(fis.exists()) 
       System.out.println("exists"); 
      if(fis.isFile()) 
       System.out.println("isFile"); 
      System.out.println(file.toAbsolutePath().toString()); 
      temp.fSize=new BigInteger(new Long(fis.length()).toString());  
    } catch(Exception e){ 
     e.printStackTrace(); 
    } 

    node.add(temp, true); 

    FileListCreator.jProgressBar.setValue(++count); 
    return CONTINUE;   
} 
+1

Можете ли вы показать код, который вы используете? Возможно, вы случайно пытаетесь писать только для чтения файлов. – Jivings

+0

Попробуйте вызвать 'fis.exists();' и 'fis.isFile();' после 'fis' инициализации. Оба они возвращаются «верно»? – MockerTim

+0

@MockerTim: нет, они оба возвращают false. У меня нет проблем с другими файлами, защищенными системой (например, ntldr), но этот не может быть разрешен для обычного файла. Я могу видеть размер и свойства файла через Total Commander. – filipbe

ответ

0

Если метод java.io.File.exists() возвращает ложь, и файл C:\pagefile.sys существует в файле система, вы указали неверный путь к файлу.

Следующий код работает на моей машине:

package q10025482; 

import java.io.File; 

public class TestFile { 
    public static void main(String[] args) { 
     String fileName = "C:/System Volume Information";//"C:/pagefile.sys" 
     File file = new File(fileName); 
     System.out.println("\nFile " + file.getAbsolutePath() + " info:"); 
     System.out.println("Exists: " + file.exists()); 
     System.out.println("Is file: " + file.isFile()); 
     System.out.println("Is dir: " + file.isDirectory()); 
     System.out.println("Length: " + file.length()); 
     System.out.println(); 
    } 
} 

Вот вывод результата:

File C:\System Volume Information info: 
Exists: true 
Is file: false 
Is dir: true 
Length: 24576 
+0

Путь верен, файл существует на моем жестком диске. У меня проблема с файлами с защитой системы (с C: \ pagefile.sys и floder "System Volume Information"). Доступ к другим файлам можно получить сейчас (даже файлы, используемые другой программой). Windows блокирует мне любую возможность увидеть эту папку, поэтому я сейчас думаю, что это возможно в java. – filipbe

+0

@filipbe Выполняет ли 'fis.exists()' true 'true'? Если не. Попробуйте выполнить код, предоставленный [Guillaume Polet] (http://stackoverflow.com/users/928711/guillaume-polet) в отдельной программе. Если это работает, то наиболее вероятной причиной является логическая ошибка где-то в вашем коде. – MockerTim

2

Это работает очень хорошо для меня:

File temp = new File("c:\\pagefile.sys"); 
System.err.println(temp.length()); 
System.err.println(temp.lastModified()); 
+1

То же самое здесь, FWIW. – adarshr

+0

печатает только для меня «0». Я хочу получить также размер файла, который используется другой программой (например, файл .xls, используемый Excel). – filipbe