@@ -9,40 +9,45 @@ export async function move(
9
9
recursively : boolean = true ,
10
10
removeFromDirectory = true ,
11
11
rootFrom ?: string ) {
12
+ try {
13
+ from = path . resolve ( from ) ;
14
+ to = path . resolve ( to ) ;
12
15
13
- from = path . resolve ( from ) ;
14
- to = path . resolve ( to ) ;
16
+ rootFrom = rootFrom || from ;
15
17
16
- rootFrom = rootFrom || from ;
18
+ const files = await fs . readdir ( from ) ;
19
+ for ( const file of files ) {
20
+ const stats = await fs . stat ( path . join ( from , file ) ) ;
21
+ if ( await stats . isFile ( ) ) {
22
+ const fileResolved = path . resolve ( from , file ) ;
23
+ const fromDirectory = path . dirname ( fileResolved ) ;
24
+ const toDirectory = fromDirectory . replace ( rootFrom , to ) ;
25
+ const toFile = path . join ( toDirectory , fileResolved . replace ( fromDirectory , "" ) ) ;
17
26
18
- const files = await fs . readdir ( from ) ;
19
- for ( const file of files ) {
20
- const stats = await fs . stat ( path . join ( from , file ) ) ;
21
- if ( await stats . isFile ( ) ) {
22
- const fileResolved = path . resolve ( from , file ) ;
23
- const fromDirectory = path . dirname ( fileResolved ) ;
24
- const toDirectory = fromDirectory . replace ( rootFrom , to ) ;
25
- const toFile = path . join ( toDirectory , fileResolved . replace ( fromDirectory , "" ) ) ;
26
-
27
- try {
28
- await mkdirpAsync ( toDirectory ) ;
29
- await fs . rename ( fileResolved , toFile ) ;
30
- } catch ( err ) {
31
- console . log ( err ) ;
27
+ try {
28
+ await mkdirpAsync ( toDirectory ) ;
29
+ await fs . rename ( fileResolved , toFile ) ;
30
+ } catch ( err ) {
31
+ console . log ( err ) ;
32
+ }
32
33
}
33
- }
34
- if ( await stats . isDirectory ( ) ) {
35
- if ( recursively === true ) {
36
- const fromDirectory = path . join ( from , file ) ;
37
- await move ( fromDirectory , to , recursively , removeFromDirectory , from ) ;
38
- if ( removeFromDirectory === true && await fs . exists ( fromDirectory ) ) {
39
- await waitForEmptyAndRemoveDirAsync ( fromDirectory ) ;
34
+ if ( await stats . isDirectory ( ) ) {
35
+ if ( recursively === true ) {
36
+ const fromDirectory = path . join ( from , file ) ;
37
+ await tryAndRetry ( async ( ) => {
38
+ await move ( fromDirectory , to , recursively , removeFromDirectory , from ) ;
39
+ } ) ;
40
+ if ( removeFromDirectory === true && fs . existsSync ( fromDirectory ) ) {
41
+ await waitForEmptyAndRemoveDirAsync ( fromDirectory ) ;
42
+ }
40
43
}
41
44
}
42
45
}
43
- }
44
- if ( removeFromDirectory === true && await fs . exists ( from ) ) {
45
- await waitForEmptyAndRemoveDirAsync ( from ) ;
46
+ if ( removeFromDirectory === true && fs . existsSync ( from ) ) {
47
+ await waitForEmptyAndRemoveDirAsync ( from ) ;
48
+ }
49
+ } catch ( err ) {
50
+ console . error ( "That's an error: " , JSON . stringify ( err ) ) ;
46
51
}
47
52
}
48
53
@@ -59,11 +64,18 @@ async function mkdirpAsync(dir: string) {
59
64
}
60
65
61
66
async function waitForEmptyAndRemoveDirAsync ( dir : string ) {
62
- let files ;
63
- while ( ( files = await fs . readdir ( dir ) ) && files ! . length > 0 ) {
67
+ let files = fs . readdirSync ( dir ) ;
68
+ while ( files . length > 0 ) {
64
69
await sleep ( 10 ) ;
70
+ if ( fs . existsSync ( dir ) ) {
71
+ files = fs . readdirSync ( dir ) ;
72
+ } else {
73
+ files = [ ] ;
74
+ }
75
+ }
76
+ if ( fs . existsSync ( dir ) ) {
77
+ fs . rmdirSync ( dir ) ;
65
78
}
66
- await fs . rmdir ( dir ) ;
67
79
}
68
80
69
81
function sleep ( milliseconds : number ) {
@@ -88,5 +100,17 @@ async function rmdir(dir: string) {
88
100
await fs . unlink ( filename ) ;
89
101
}
90
102
}
91
- await fs . rmdir ( dir ) ;
103
+ if ( await fs . exists ( dir ) ) {
104
+ await fs . rmdir ( dir ) ;
105
+ }
106
+ }
107
+ async function tryAndRetry ( action : Function , maxTries = 5 ) {
108
+ while ( true ) {
109
+ try {
110
+ action ( ) ;
111
+ break ;
112
+ } catch ( err ) {
113
+ await sleep ( 10 ) ;
114
+ }
115
+ }
92
116
}
0 commit comments