2016-01-29 10 views
8

Ich erhalte ein anderes Ergebnis für Files.exists(path) zu path.toFile().exists() für eine lokale Datei unter Windows. Ich kann diese Datei in Windows Explorer sehen, obwohl ich (zufällig) Berechtigungen geändert habe und vielleicht machen die Berechtigungen keinen Sinn.Files.exists (Pfad) und path.toFile(). Exists() geben unterschiedliche Ergebnisse für die gleiche Datei

Dies erklärt jedoch nicht, warum die alte Methode true zurückgibt und die neue Methode false zurückgibt. Die Datei existiert definitiv, aber vielleicht ist sie für den Benutzer, der den Java-Code ausführt, unsichtbar, so dass ich nicht sicher bin, was die richtige Antwort sein sollte. Noch kann ich sehen, wie man sieht, welcher Benutzer den Code ausführt, es gibt nur einen echten Benutzer Paul auf dem Computer, aber ich frage mich, ob ob als Administrator ausgeführt wird oder nicht, Dinge.

System.out.println("Path Exists(1):"+Files.exists(path)); 
System.out.println("Path Exist(2) :"+path.toFile().exists()); 

gibt

Path Exists(1):false 
Path Exist(2) :true 

Auch

System.out.println("Path readable(3) :"+Files.isReadable(path)); 
System.out.println("Path readable(4):"+path.toFile().canRead()); 

Arbeiten in gleicher Weise

Path readable(3) :false 
Path readable(4):true 

Berechtigungen Ausgabe

geben
File C:\Code\jthink\opensrc\jaudiotagger\testdata\test157.dsf permissions 
owner:PCLAPTOP\Paul 
NT AUTHORITY\SYSTEM:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/DELETE_CHILD/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/WRITE_ACL/WRITE_OWNER/SYNCHRONIZE:DENY 
BUILTIN\Administrators:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/DELETE_CHILD/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/WRITE_ACL/WRITE_OWNER/SYNCHRONIZE:DENY 
BUILTIN\Administrators:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/DELETE_CHILD/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/WRITE_ACL/WRITE_OWNER/SYNCHRONIZE:ALLOW 
NT AUTHORITY\SYSTEM:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/DELETE_CHILD/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/WRITE_ACL/WRITE_OWNER/SYNCHRONIZE:ALLOW 
BUILTIN\Users:READ_DATA/READ_NAMED_ATTRS/EXECUTE/READ_ATTRIBUTES/READ_ACL/SYNCHRONIZE:ALLOW 
NT AUTHORITY\Authenticated Users:READ_DATA/WRITE_DATA/APPEND_DATA/READ_NAMED_ATTRS/WRITE_NAMED_ATTRS/EXECUTE/READ_ATTRIBUTES/WRITE_ATTRIBUTES/DELETE/READ_ACL/SYNCHRONIZE:ALLOW 


c:\Code\jthink\opensrc\jaudiotagger>attrib C:\Code\jthink\opensrc\jaudiotagger\testdata\test157.dsf 
A R  C:\Code\jthink\opensrc\jaudiotagger\testdata\test157.dsf 

Aktualisieren Ich habe keine Schlussfolgerung, aber dachte, diese Informationen könnten nützlich sein.

Ich wurde aktiviert, ohne die IDE Run-Programm als Administrator Option Code in IntelliJ IDE ausgeführt wird, dies ermöglicht dann die Java-Anwendung auch die Administratorrechte erhalten verursacht haben zu.

Interessant für eine andere Datei Ich habe keine DENY-Berechtigungen hinzugefügt, ich habe nur Erben Berechtigungen deaktiviert und READ-Berechtigungen aus allen Gruppen entfernen. Dann, wenn ich als Benutzer ohne Lauf lief als Admin aktiviert konnte es nicht die Datei lesen und auch könnte diesen Code nicht ausgegeben, Informationen zu

AclFileAttributeView view = Files.getFileAttributeView(path, AclFileAttributeView.class); 
if (view != null) 
{ 
    sb.append("Owner:"+view.getOwner().getName()+"**"); 
    for (AclEntry acl : view.getAcl()) 
    { 
     sb.append(acl.principal()+"**"); 
     for(AclEntryPermission aep:acl.permissions()) 
     { 
      sb.append(aep.toString() + "**"); 
     } 
    } 
} 

aber wenn ich mit Run-Programm als Administrator ausführen aktivieren, damit nach wie vor die Datei, aber der obige Code tat jetzt Ausgabe einige der Berechtigungen könnte nicht wie folgt lauten:

Besitzer: BUILTIN \ Administratoren

NT AUTHORITY \ SYSTEM: WRITE_DATA/append_data/WRITE _NAMED_ATTRS/write_attributes/synchronize: allow PCLAPTOP \ Paul: WRITE_DATA/append_data/WRITE_NAMED_ATTRS/write_attributes/synchronize: allow BUILTIN \ Administratoren: WRITE_DATA/append_data/WRITE_NAMED_ATTRS/write_attributes/synchronize: allow

wie Sie sehen können sogar obwohl Administrators keine oder READ PERMISSIONS Optionen haben, können sie die Berechtigungen ausgeben, während sie vorher nicht konnten, vielleicht weil BUILTIN/Administrator als Eigentümer zurückgegeben wurde.

+0

es ist eine Audiodatei. –

+1

Wie bauen Sie 'Pfad'? –

+1

Ive Ausgabe zu Frage hinzugefügt –

Antwort

4

Versuchen Sie, diese zu lesen: https://docs.oracle.com/javase/tutorial/essential/io/check.html

Es besagt, dass, Files.exists(path) falsche Rückkehr bedeutet nicht, dass sie nicht existiert, also ja es scheint, ein Berechtigungsproblem gibt. Versuchen Sie die Files.notExists(path) auch und sehen Sie, was es zurückgibt. Wenn es falsch ist, bedeutet dies, dass nicht festgestellt werden kann, ob die Datei existiert. Wenn sie jedoch wahr zurückgibt, liegt wahrscheinlich ein Problem in Ihrem Code vor.

Versuchen Sie, Ihre Datei über die Befehlszeile statt Netbeans auszuführen. Wenn Sie nicht wissen, wie man das macht, können Sie nur google suchen, es gibt Tonnen von Sachen auf diesem, aber im Grunde, was Sie tun möchten, ist das kompilieren der .java-Datei mit javac myfile.java und dann führen Sie es mit java myfile. Tun Sie dies mit einer normalen Eingabeaufforderung und einem, den Sie als Administrator öffnen, und sehen Sie, was Sie bekommen.

+0

Als ich das las, nahm ich an, dass es wegen Netzwerkproblemen keinen Zugriff hatte, aber ja, ich denke, Sie haben Recht. Aber ich sehe das nicht als eine Verbesserung gegenüber der alten Methode. Früher habe ich nach Dateiexistenzen gesucht und dann nach Dateilesbarkeit, jetzt scheint es, dass ich nur nach Dateiexistenzen suchen kann, wenn ich Leseberechtigungen für Dateien habe. Ich weiß, wie man von der Befehlszeile aus läuft, aber wie läuft man als Adminstrator über die Befehlszeile unter Windows? –

+0

Nach meinem besten Wissen sollte es genügen, die Kommandozeile als Admin zu starten. Ich bin mir nicht sicher, ob ich verstehe, was Sie mit Verbesserung meinen. Dein Ansatz ist in Ordnung, denke ich, er folgt dem Dokument und prüft auf Existenz und Lesbarkeit. Das Problem scheint Ihre Zugriffsrechte zu sein, wie Alex sagt, wenn Sie es auf einem Webserver irgendeiner Art (JBoss, Tomcat) laufen lassen, überprüfen Sie ihre Einstellungen. – PNS

+0

Durch 'Verbesserung' meine ich mit der alten file.exists() Methode können Sie überprüfen, ob die Datei unabhängig von Ihren Berechtigungen existiert, dann können Sie canRead (0, um zu überprüfen, ob Sie es lesen können. Mit der neuen exists() -Methode es scheint, dass Sie nur überprüfen können, ob es existiert, wenn Sie Berechtigungen haben, so dass Sie nicht unterscheiden können, existiert nicht und existiert aber keine Berechtigung zu prüfen, ob es existiert. Danke fand die Eingabeaufforderung (Adminstrator) Option jetzt, aber ich würde Stil mögen Um zu wissen, wie man rennt, wählen Sie, ob JetBrains als Adminsitrator ausgeführt werden soll. –

3

Thesen sind zwei verschiedene Methoden: Files.exists() und path.toFile(). Exists().

Files.exists() definiert, dass die Datei mit diesem abstrakten Pfadnamen existiert. Mit anderen Worten, diese Datei existiert und der Benutzer hat Lesezugriff darauf.

path.toFile().exists() zeigt an, dass die Datei vorhanden ist, dann gibt es keine Garantie, dass ein Subsequenzzugriff erfolgreich ist. Mit anderen Worten, die Datei existiert, ohne zu prüfen, ob der Benutzer READ-Zugriff darauf hat.

Es hängt wirklich von Benutzer ab, der das Programm ausführt. Wenn Sie unter Ihrer ID (Paul) arbeiten, funktioniert es gut. Vor allem in der Befehlszeile, wo Sie den ATTRIB-Befehl erhalten haben.

Wenn Sie jedoch eine andere Anwendung verwenden, um Ihren Code auszuführen, hängt dies von der Systemkonfiguration ab. Führen Sie diesen ATTRIB oder einen ähnlichen Befehl in Ihrer Anwendung aus und Sie werden sehen.

Ich denke, Sie führen einige Website unter IIS. Dieser Weg wird normalerweise für den Benutzer der untersten Ebene im System konfiguriert, mit fast keinen Rechten, um Sicherheitslücken zu vermeiden. Normalerweise sind es alle oder NT-AUTORITÄT. Da ich dieses bestimmte Zugriffs sehen kann, hat keine Rechte Ihre Datei

NT AUTHORITY \ SYSTEM zu lesen: READ_DATA/...: DENY

Natürlich Sie 2 verschiedene Antworten haben - FALSCH: Benutzer die ID Wird von laufender Anwendung verwendet, kann diese Datei nicht lesen, TRUE: Datei existiert physisch.

Ändern Sie die laufende ID für Ihre Anwendung oder erteilen Sie READ Zugriff auf alle für diese bestimmte Datei einschließlich aller Verzeichnisse in seinem Pfad und Sie haben das gleiche Ergebnis in diesen beiden Methoden, die verschiedene Bedeutungen überprüfen.

+0

Danke Ich erwarte, dass Sie Recht haben, aber ich bekomme es nicht vom Lesen der Javadoc, beide sagen, wenn ein Sicherheitsmanager existiert, überprüfen sie seine SecurityManager.checkRead (java.lang.String) -Methode für den Dateizugriff, es ist wirklich nicht klar, dass einer ignoriert Lesezugriff und der andere nicht. (Übrigens sind deine Javadoc-Links falsch herum). Ich betreibe keine Website, es ist eine Swing-Java-Anwendung. Was ich nicht verstehe, wenn ich als Adminstrator arbeite, habe ich nicht zusätzlich die Berechtigungen des normalen Benutzers zusätzlich zu den Berechtigungen des Adminsitrators. –

+0

Im App-Ausführungsbefehl (Runtime.exec) können Sie feststellen, wer Sie sind (whoami) und sehen, welcher Benutzer Ihre App verwendet. Das ist die einzig mögliche Erklärung, was ich sehen kann. (BTW sieht für mich aus, dass meine Links korrekt sind Datei ist für Datei und Dateien ist für Dateien) – Alex

+0

wusste nie whoami war unter Windows verfügbar - danke. Aber ich weiß, dass der Benutzer, was ich nicht weiß, weiß, ob die Anwendung als Administrator ausgeführt wird, d. H. Mit zusätzlichen Administratorrechten, ist also möglich. Ich habe Ihre Javadoc-Links erneut überprüft und sie scheinen immer noch falsch herum zu sein. –