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);
}
}
}
'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
Welchen Sinn macht es, lesbare oder schreibbare Berechtigungen für Dateien oder Ordner festzulegen, die Sie selbst erstellen? – greenapps
'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