2016-09-20 2 views
1

Unser Ziel ist es, lesbare und schreibbare Berechtigungen für Ordner zu setzen. unter Verwendung von [setReadable(bool)][1] und [setWritable(bool)][1]. Das ist es.Android - isDirectory gibt immer false für neue Datei zurück (pathToDirectoryString)

Wir schreiben bereits Dateien in sie und lesen Dateien von ihnen, aber als Vorsichtsmaßnahme möchten wir diese Berechtigungen explizit festlegen.

Der Code ist unten. Geht etwas verloren von mkdirs() zu getAbsolutePath() zu new File zu isDirectory()? Denn aus irgendeinem Grunde, wenn wir überprüfen, ob die folderPath ein Verzeichnis ist, kehrt es immer falsch, obwohl das Protokoll identifiziert ihn eindeutig als Pfad zu einem Verzeichnis ...

//This is in the onCreate function of the service. 
File mainFolder = new File(thisService.this.getExternalFilesDir(null), "mainFolder"); 

if (!mainFolder.exists()) { 
    //The folder doesn't exist yet, so create it. 
    mainFolder.mkdirs(); 

    //And then make the other folders we'll need. 
    File confsFolder = new File(File mainFolder.getAbsoluteFile()+"/confs"); 
    confsFolder.mkdirs(); 

    File logsFolder =new File(File mainFolder.getAbsoluteFile()+"/logs"); 
    logsFolder.mkdirs(); 

    File packagesFolder = new File(File mainFolder.getAbsoluteFile()+"/packages"); 
    packagesFolder.mkdirs(); 

    } 

//String variables holding the folder paths. 
confsFolderPathString = mainFolder.getAbsolutePath() + "/confs/ "; 
logsFolderPathString = mainFolder.getAbsolutePath() + "/logs/ "; 
packagesFolderPathString = mainFolder.getAbsolutePath() + "/packages/ "; 

setPermissions(new File(confsFolderPathString)); 
setPermissions(new File(logsFolderPathString)); 
setPermissions(new File(packagesFolderPathString)); 

... elswhere im Dienst ...

private void setPermissions(File folderPath) { 
    Log.d(TAG, "setPermissions: "); 
    //Credit to: http://stackoverflow.com/a/11482350/956975 

    Log.d(TAG, "setPermissions: folderPath -> "+folderPath.getAbsoluteFile()); 
    //That log produces this strings: 
    //setPermissions: folderPath -> /storage/emulated/0/Android/data/our.package.domain.and.project/files/mainFolder/confs/ 
    //setPermissions: folderPath -> /storage/emulated/0/Android/data/our.package.domain.and.project/files/mainFolder/logs/ 
    //setPermissions: folderPath -> /storage/emulated/0/Android/data/our.package.domain.and.project/files/mainFolder/packages/ 
    //Those are DIRECTORIES, right? 

    //Get the list of files (which could include folders) in the folderPath. 

    if(folderPath.isDirectory()){ //<-------------THIS IS ALWAYS FALSE 

     File[] list = folderPath.listFiles(); 

     if(list != null && list.length > 0){ 
      for (File f : list) {  
       if (f.isDirectory()) { 

        Log.d("setPermissions: ", "Dir: " + f.getAbsoluteFile()); 

        //Set readable permissions 
        f.setReadable(true);       
        //Set writable permissions 
        f.setWritable(true); 

        //Go deeper into the directory 
        setPermissions(f, true, true); 

        } else { 
         Log.d("setPermissions: ", "File: " + f.getAbsoluteFile()); 

         //Set readable permissions 
         f.setReadable(true) 
         //Set writable permissions 
         f.setWritable(true); 

        } 
       } 
      }else{ 
       try { 
        throw new Exception("setPermissions: Directory list is empty."); 
       } catch (Exception e) { 
        Log.e(TAG, "setPermissions: Directory list is empty.", e); 
       } 
      } 
     }else{ 
      try { 
       throw new FileNotFoundException("setPermissions: "+folderPath.getAbsolutePath() + " is not a directory."); 
      } catch (FileNotFoundException e) { 
       Log.e(TAG, "setPermissions: "+folderPath.getAbsolutePath()+" is not a directory.", e); 
      } 
     } 
    } 
+0

'mainFolder.mkdirs();'. Sie sollten den Rückgabewert überprüfen. Oder überprüfen Sie erneut, ob das Verzeichnis existiert. Und wenn nicht zurück. Fahren Sie nicht mit dem Code fort, wenn nicht. Zeigen Sie einen Toast() an, der das sagt. – greenapps

+0

Welchen Sinn macht es, lesbare oder schreibbare Berechtigungen für Dateien oder Ordner festzulegen, die Sie selbst erstellen? – greenapps

+0

'if (folderPath.isDirectory()) {// <------------- DAS IST IMMER FALSCH '. Sie sollten zuerst prüfen, ob dieser Pfad existiert(). Wenn es nicht existiert, liegt es daran, dass Sie den Rückgabewert von mkdirs() nicht überprüft haben. – greenapps

Antwort

1

ich denke, es ist falsch zurückkehrt, weil das Verzeichnis noch nicht existiert, wenn Sie isDirectory() nennen.

Also, vor dem Check, wenn es ein directoty, chec falls vorhanden:

private void setPermissions(File folderPath) { 

    ... 

    if(folderPath.exists() && folderPath.isDirectory()) { 
     // ALL FUNCTIONALITY 
    } 
} 

EDIT:

Sie haben einen Fehler in der, wenn comprobation für Verzeichnisse erstellen. Du bist gerade !File statt !mainFolder.exists()

if (!File mainFolder.exists()) { 

ersetzen Sie es durch

if (!mainFolder.exists()) { 
+0

Es tut mir leid, Verwirrung verursacht zu haben - ich dachte, ich hätte den Inhalt vor dem Posten ausreichend geprüft. Ich mache das, wenn (! MainFolder.exists()) {. Das Original war wahrscheinlich ein Kopier- und Einfügefehler ... Entschuldigung. – marienke

Verwandte Themen