2012-04-05 4 views
2

Je cours un programme pour lister l'information de tous les dossiers stockés dans le dossier. Je veux obtenir les propriétés d'un fichier (le plus important pour moi est la taille du fichier, mais j'aimerais aussi avoir d'autres propriétés, comme la date de modification, etc.).Accès refusé - Obtenir les propriétés du fichier?

Mon problème est quand j'arrive au fichier qui est réellement utilisé par un autre programme, je ne peux pas obtenir BasicFileAtrributtes du fichier. J'ai essayé d'utiliser File, URL, RandomFileAcces, mais tous ces requiese pour ouvrir un fichier, et un jet d'exception comme:

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

Yat-il une option en Java pour obtenir ces propriétés? Je préfère ne pas utiliser de bibliothèques supplémentaires, pour garder une petite taille de l'application.

L'application est basée sur java JRE7. Je m'appelle java.nio.file.SimpleFileVisitor pour visiter tous les fichiers. Voici fragment de mon code, où je suis l'erreur:

@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

Pouvez-vous montrer le code que vous utilisez? Peut-être que vous essayez accidentellement d'écrire pour lire uniquement les fichiers. – Jivings

+0

Essayez d'appeler 'fis.exists();' et 'fis.isFile();' après l'initialisation 'fis'. Est-ce qu'ils retournent tous les deux 'true'? – MockerTim

+0

@MockerTim: non, ils retournent tous les deux faux. Je n'ai pas de problème avec d'autres fichiers protégés par le système (comme ntldr), mais celui-ci ne peut pas être résolu en fichier régulier. Je peux voir la taille et les propriétés du fichier à travers le Total Commander. – filipbe

Répondre

0

Si la méthode java.io.File.exists() retourne false, et le fichier C:\pagefile.sys existe dans votre fichier système, vous avez spécifié le chemin de fichier incorrect alors.

Le code suivant fonctionne sur ma machine:

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(); 
    } 
} 

Voici la sortie de résultat:

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

chemin est correct, le fichier existe sur mon disque dur. J'ai seulement un problème avec les fichiers protégés par le système (avec C: \ pagefile.sys, et floder "System Volume Information"). d'autres fichiers peuvent être accédés maintenant (même les fichiers utilisés par un autre programme). Windows me bloque toute option pour voir ce dossier, donc je pense maintenant, c'est possible en java. – filipbe

+0

@filipbe Est-ce que 'fis.exists()' retourne 'true' maintenant? Si non. Essayez d'exécuter le code fourni par [Guillaume Polet] (http://stackoverflow.com/users/928711/guillaume-polet) dans un programme séparé. Si cela fonctionne, la raison la plus probable est l'erreur logique quelque part dans votre code. – MockerTim

2

Cela fonctionne très bien pour moi:

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

Même ici, FWIW. – adarshr

+0

il imprime pour moi seulement "0". Je veux aussi obtenir la taille du fichier qui est utilisé par un autre programme (comme un fichier .xls utilisé par Excel). – filipbe