mirror of
https://code.blicky.net/yorhel/ncdu.git
synced 2026-01-16 10:38:40 -09:00
Improved deletion performance
This commit is contained in:
parent
f6e34e520e
commit
4b6456d0b9
1 changed files with 16 additions and 6 deletions
22
src/delete.c
22
src/delete.c
|
|
@ -167,11 +167,6 @@ int delete_key(int ch) {
|
||||||
int delete_dir(struct dir *dr) {
|
int delete_dir(struct dir *dr) {
|
||||||
struct dir *nxt, *cur;
|
struct dir *nxt, *cur;
|
||||||
int r;
|
int r;
|
||||||
char *path;
|
|
||||||
|
|
||||||
/* calling path_chdir() this often isn't exactly efficient... */
|
|
||||||
path = getpath(dr->parent);
|
|
||||||
path_chdir(path);
|
|
||||||
|
|
||||||
/* check for input or screen resizes */
|
/* check for input or screen resizes */
|
||||||
curdir = dr;
|
curdir = dr;
|
||||||
|
|
@ -180,6 +175,8 @@ int delete_dir(struct dir *dr) {
|
||||||
|
|
||||||
/* do the actual deleting */
|
/* do the actual deleting */
|
||||||
if(dr->flags & FF_DIR) {
|
if(dr->flags & FF_DIR) {
|
||||||
|
if((r = chdir(dr->name)) < 0)
|
||||||
|
goto delete_nxt;
|
||||||
if(dr->sub != NULL) {
|
if(dr->sub != NULL) {
|
||||||
nxt = dr->sub;
|
nxt = dr->sub;
|
||||||
while(nxt != NULL) {
|
while(nxt != NULL) {
|
||||||
|
|
@ -189,10 +186,13 @@ int delete_dir(struct dir *dr) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if((r = chdir("..")) < 0)
|
||||||
|
goto delete_nxt;
|
||||||
r = rmdir(dr->name);
|
r = rmdir(dr->name);
|
||||||
} else
|
} else
|
||||||
r = unlink(dr->name);
|
r = unlink(dr->name);
|
||||||
|
|
||||||
|
delete_nxt:
|
||||||
/* error occured, ask user what to do */
|
/* error occured, ask user what to do */
|
||||||
if(r == -1 && !ignoreerr) {
|
if(r == -1 && !ignoreerr) {
|
||||||
state = DS_FAILED;
|
state = DS_FAILED;
|
||||||
|
|
@ -217,8 +217,18 @@ void delete_process() {
|
||||||
if(input_handle(0))
|
if(input_handle(0))
|
||||||
return browse_init(root);
|
return browse_init(root);
|
||||||
|
|
||||||
|
/* chdir */
|
||||||
|
if(path_chdir(getpath(root->parent)) < 0) {
|
||||||
|
state = DS_FAILED;
|
||||||
|
lasterrno = errno;
|
||||||
|
while(state == DS_FAILED)
|
||||||
|
if(input_handle(0))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* delete */
|
/* delete */
|
||||||
seloption = 0;
|
seloption = 0;
|
||||||
|
state = DS_PROGRESS;
|
||||||
if(delete_dir(root))
|
if(delete_dir(root))
|
||||||
browse_init(root);
|
browse_init(root);
|
||||||
else {
|
else {
|
||||||
|
|
@ -231,7 +241,7 @@ void delete_process() {
|
||||||
|
|
||||||
void delete_init(struct dir *dr, struct dir *s) {
|
void delete_init(struct dir *dr, struct dir *s) {
|
||||||
state = DS_CONFIRM;
|
state = DS_CONFIRM;
|
||||||
root = dr;
|
root = curdir = dr;
|
||||||
pstate = ST_DEL;
|
pstate = ST_DEL;
|
||||||
nextsel = s;
|
nextsel = s;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue