1
1
package com .unixtools .command .filemanagement ;
2
2
3
+ import com .unixtools .core .Command ;
4
+
3
5
import java .io .File ;
6
+ import java .nio .file .Path ;
7
+ import java .nio .file .Paths ;
4
8
import java .text .SimpleDateFormat ;
5
- import java .util .Arrays ;
9
+ import java .util .ArrayList ;
6
10
import java .util .List ;
7
11
8
- import com .unixtools .core .Command ;
9
-
10
12
public class LsCommand implements Command {
11
- private static final String VALID_FLAGS = "-a, -l, -R " ;
13
+ private static final String VALID_FLAGS = "alR " ;
12
14
13
15
@ Override
14
16
public void execute (String [] args ) {
15
- List <String > arguments = Arrays .asList (args );
16
- if (!arguments .stream ().allMatch (arg -> arg .equals ("-a" ) || arg .equals ("-l" ) || arg .equals ("-R" ))) {
17
+ List <String > flags = new ArrayList <>();
18
+ String path = parseArguments (args , flags );
19
+
20
+ if (!validateFlags (flags )) {
17
21
System .out .println ("Invalid flag(s). Valid flags are: " + VALID_FLAGS );
18
22
return ;
19
23
}
20
24
21
- File currentDir = new File ("." );
22
- processDirectory (currentDir , arguments , 0 , "" );
25
+ File directory = validatePath (path );
26
+ if (directory == null )
27
+ return ;
28
+
29
+ processDirectory (directory , flags , 0 , "" );
23
30
}
24
31
25
- private void processDirectory (File dir , List <String > arguments , int level , String prefix ) {
26
- boolean longListing = arguments .contains ("-l" );
27
- boolean recursive = arguments .contains ("-R" );
32
+ private String parseArguments (String [] args , List <String > flags ) {
33
+ String path = "." ;
34
+ for (String arg : args ) {
35
+ if (arg .startsWith ("-" )) {
36
+ for (char flag : arg .substring (1 ).toCharArray ()) {
37
+ flags .add (String .valueOf (flag ));
38
+ }
39
+ } else {
40
+ path = normalizePath (arg );
41
+ break ;
42
+ }
43
+ }
44
+ return path ;
45
+ }
28
46
29
- File [] filesList = dir .listFiles (file -> arguments .contains ("-a" ) || !file .isHidden ());
30
- if (filesList == null || filesList .length == 0 ) {
31
- if (level == 0 ) {
32
- System .out .println (".." );
47
+ private String normalizePath (String path ) {
48
+ String normalizedPath = path .replace ("\\ " , "/" );
49
+ Path pathObj = Paths .get (normalizedPath ).normalize ();
50
+ return pathObj .toString ();
51
+ }
52
+
53
+ private boolean validateFlags (List <String > flags ) {
54
+ for (String flag : flags ) {
55
+ if (!VALID_FLAGS .contains (flag )) {
56
+ return false ;
33
57
}
58
+ }
59
+ return true ;
60
+ }
61
+
62
+ private File validatePath (String path ) {
63
+ File dir = new File (path );
64
+ if (!dir .exists ()) {
65
+ System .out .println ("The specified directory does not exist." );
66
+ return null ;
67
+ }
68
+ if (!dir .isDirectory ()) {
69
+ System .out .println ("The specified path is not a directory." );
70
+ return null ;
71
+ }
72
+ return dir ;
73
+ }
74
+
75
+ private void processDirectory (File dir , List <String > flags , int level , String prefix ) {
76
+ boolean longListing = flags .contains ("l" );
77
+ boolean recursive = flags .contains ("R" );
78
+
79
+ File [] filesList = dir .listFiles (file -> flags .contains ("a" ) || !file .isHidden ());
80
+ if (filesList == null || filesList .length == 0 ) {
81
+ System .out .println (prefix + "Empty directory." );
34
82
return ;
35
83
}
36
84
37
85
for (int i = 0 ; i < filesList .length ; i ++) {
38
86
File file = filesList [i ];
39
- String connector = (i < filesList .length - 1 ) ? "├── " : "└── " ;
40
- String childPrefix = (i < filesList .length - 1 ) ? "| " : " " ;
41
-
42
- System .out .print (prefix + connector );
87
+ printTreeStructure (file , i , filesList .length , prefix );
43
88
printFileInfo (file , longListing );
44
89
45
90
if (recursive && file .isDirectory ()) {
46
- processDirectory (file , arguments , level + 1 , prefix + childPrefix );
91
+ String nextPrefix = prefix + (i < filesList .length - 1 ? "| " : " " );
92
+ processDirectory (file , flags , level + 1 , nextPrefix );
47
93
}
48
94
}
49
95
}
50
96
97
+ private void printTreeStructure (File file , int index , int total , String prefix ) {
98
+ String connector = (index < total - 1 ) ? "├── " : "└── " ;
99
+ System .out .print (prefix + connector );
100
+ }
101
+
51
102
private void printFileInfo (File file , boolean longListing ) {
52
103
if (longListing ) {
53
104
SimpleDateFormat sdf = new SimpleDateFormat ("MM/dd/yyyy HH:mm:ss" );
@@ -56,4 +107,4 @@ private void printFileInfo(File file, boolean longListing) {
56
107
System .out .println (file .getName ());
57
108
}
58
109
}
59
- }
110
+ }
0 commit comments