* i2psnark: Fix directories not always deleted when torrent is deleted

This commit is contained in:
zzz
2011-12-04 18:49:07 +00:00
parent b2e4ab4a30
commit 0d145fc77f

View File

@ -584,7 +584,7 @@ public class I2PSnarkServlet extends Default {
File f = new File(name); File f = new File(name);
f.delete(); f.delete();
_manager.addMessage(_("Torrent file deleted: {0}", f.getAbsolutePath())); _manager.addMessage(_("Torrent file deleted: {0}", f.getAbsolutePath()));
List files = meta.getFiles(); List<List<String>> files = meta.getFiles();
String dataFile = snark.getBaseName(); String dataFile = snark.getBaseName();
f = new File(_manager.getDataDir(), dataFile); f = new File(_manager.getDataDir(), dataFile);
if (files == null) { // single file torrent if (files == null) { // single file torrent
@ -594,23 +594,36 @@ public class I2PSnarkServlet extends Default {
_manager.addMessage(_("Data file could not be deleted: {0}", f.getAbsolutePath())); _manager.addMessage(_("Data file could not be deleted: {0}", f.getAbsolutePath()));
break; break;
} }
for (int i = 0; i < files.size(); i++) { // pass 1 delete files // step 1 delete files
for (int i = 0; i < files.size(); i++) {
// multifile torrents have the getFiles() return lists of lists of filenames, but // multifile torrents have the getFiles() return lists of lists of filenames, but
// each of those lists just contain a single file afaict... // each of those lists just contain a single file afaict...
File df = Storage.getFileFromNames(f, (List) files.get(i)); File df = Storage.getFileFromNames(f, files.get(i));
if (df.delete()) if (df.delete())
_manager.addMessage(_("Data file deleted: {0}", df.getAbsolutePath())); _manager.addMessage(_("Data file deleted: {0}", df.getAbsolutePath()));
else else
_manager.addMessage(_("Data file could not be deleted: {0}", df.getAbsolutePath())); _manager.addMessage(_("Data file could not be deleted: {0}", df.getAbsolutePath()));
} }
for (int i = files.size() - 1; i >= 0; i--) { // pass 2 delete dirs - not foolproof, // step 2 make Set of dirs with reverse sort
// we could sort and do a strict bottom-up Set<File> dirs = new TreeSet(Collections.reverseOrder());
File df = Storage.getFileFromNames(f, (List) files.get(i)); for (List<String> list : files) {
df = df.getParentFile(); for (int i = 1; i < list.size(); i++) {
if (df == null || !df.exists()) dirs.add(Storage.getFileFromNames(f, list.subList(0, i)));
continue; }
if(df.delete()) }
// step 3 delete dirs bottom-up
for (File df : dirs) {
if (df.delete()) {
_manager.addMessage(_("Data dir deleted: {0}", df.getAbsolutePath())); _manager.addMessage(_("Data dir deleted: {0}", df.getAbsolutePath()));
} else if (_log.shouldLog(Log.WARN)) {
_log.warn("Could not delete dir " + df);
}
}
// step 4 delete base
if (f.delete()) {
_manager.addMessage(_("Data dir deleted: {0}", f.getAbsolutePath()));
} else if (_log.shouldLog(Log.WARN)) {
_log.warn("Could not delete dir " + f);
} }
break; break;
} }