Skip to main content

file/
file.rs

1use baidu_netdisk_sdk::BaiduNetDiskClient;
2use log::info;
3use std::io::{self, BufRead};
4
5#[tokio::main]
6async fn main() -> Result<(), Box<dyn std::error::Error>> {
7    // Initialize logger
8    env_logger::init();
9
10    println!("=== Baidu NetDisk File Management Test ===\n");
11
12    // Create client - will automatically load from .env file
13    let client = BaiduNetDiskClient::builder().build()?;
14    info!("Client created successfully");
15
16    // Load token from environment variables
17    client.load_token_from_env()?;
18    info!("Token loaded successfully");
19
20    // === Test 0: List root directory to verify permission ===
21    println!("=== Test 0: List Root Directory ===");
22    println!("Listing contents of root directory: /");
23    wait_for_enter();
24
25    match client.file().list_directory("/").await {
26        Ok(files) => {
27            println!("✓ Successfully listed root directory!");
28            println!("  Found {} items:", files.len());
29            for file in files {
30                let type_str = if file.isdir == Some(1) { "DIR" } else { "FILE" };
31                let size_str = if let Some(s) = file.size {
32                    format!("{} bytes", s)
33                } else {
34                    "N/A".to_string()
35                };
36                println!("    [{}] {} ({})", type_str, file.name, size_str);
37            }
38        }
39        Err(e) => {
40            println!("! Failed to list root directory: {}", e);
41            println!("  Please check your token and permissions.");
42            return Ok(());
43        }
44    }
45
46    // Test folder and file paths
47    let test_folder = "/upload";
48    let test_file = "/upload/subscribe.json";
49    let test_folder_new = "/upload_new";
50    let test_file_new = "/upload_new/subscribe.json";
51    let test_file_renamed = "/upload_new/subscribe_renamed.json";
52
53    // === Test 1: Check if /upload folder exists ===
54    println!("\n=== Test 1: Check /upload folder ===");
55    println!("Checking folder: {}", test_folder);
56    wait_for_enter();
57
58    match client.file().get_file_info(test_folder).await {
59        Ok(info) => {
60            println!("✓ Folder /upload exists!");
61            println!("  fs_id: {:?}", info.fs_id);
62            println!("  path: {}", info.path);
63            println!("  isdir: {:?}", info.isdir);
64            println!("  ctime: {:?}", info.ctime);
65            println!("  mtime: {:?}", info.mtime);
66        }
67        Err(e) => {
68            println!(
69                "! Folder /upload does not exist or cannot be accessed: {}",
70                e
71            );
72            println!("  Please create the folder manually or check your permissions.");
73            return Ok(());
74        }
75    }
76
77    // === Test 2: List upload directory first ===
78    println!("\n=== Test 2: List /upload Directory ===");
79    println!("Listing contents of: {}", test_folder);
80    wait_for_enter();
81
82    let upload_files = match client.file().list_directory(test_folder).await {
83        Ok(files) => {
84            println!("✓ Directory listed successfully!");
85            println!("  Found {} items:", files.len());
86            for file in &files {
87                let type_str = if file.isdir == Some(1) { "DIR" } else { "FILE" };
88                let size_str = if let Some(s) = file.size {
89                    format!("{} bytes", s)
90                } else {
91                    "N/A".to_string()
92                };
93                println!("    [{}] {} ({})", type_str, file.name, size_str);
94            }
95            Some(files)
96        }
97        Err(e) => {
98            println!("! Failed to list directory: {}", e);
99            None
100        }
101    };
102
103    // === Test 3: Check if subscribe.json exists ===
104    println!("\n=== Test 3: Check subscribe.json file ===");
105    println!("Checking file: {}", test_file);
106    wait_for_enter();
107
108    match client.file().get_file_info(test_file).await {
109        Ok(info) => {
110            println!("✓ File {} exists!", test_file);
111            println!("  fs_id: {:?}", info.fs_id);
112            println!("  path: {}", info.path);
113            println!("  name: {}", info.name);
114            println!("  size: {:?} bytes", info.size);
115            println!("  isdir: {:?}", info.isdir);
116            println!("  md5: {:?}", info.md5);
117            println!("  ctime: {:?}", info.ctime);
118            println!("  mtime: {:?}", info.mtime);
119        }
120        Err(e) => {
121            println!(
122                "! File {} does not exist or cannot be accessed: {}",
123                test_file, e
124            );
125            // If directory content is listed, show to user
126            if let Some(files) = upload_files {
127                println!("  Available files in /upload:");
128                for file in files {
129                    let type_str = if file.isdir == Some(1) { "DIR" } else { "FILE" };
130                    println!("    [{}] {}", type_str, file.name);
131                }
132            }
133            return Ok(());
134        }
135    }
136
137    // === Test 4: Create new folder ===
138    println!("\n=== Test 4: Create Folder ===");
139    println!("Creating folder: {}", test_folder_new);
140    wait_for_enter();
141
142    match client.file().create_folder(test_folder_new).await {
143        Ok(folder) => {
144            println!("✓ Folder created successfully!");
145            println!("  fs_id: {:?}", folder.fs_id);
146            println!("  path: {}", folder.path);
147            println!("  ctime: {:?}", folder.ctime);
148        }
149        Err(e) => {
150            println!("! Failed to create folder: {}", e);
151            return Ok(());
152        }
153    }
154
155    // === Test 5: Copy file ===
156    println!("\n=== Test 5: Copy File ===");
157    println!("Copying file: {} -> {}", test_file, test_folder_new);
158    wait_for_enter();
159
160    match client.file().copy_file(test_file, test_folder_new).await {
161        Ok(_) => println!("✓ File copied successfully!"),
162        Err(e) => {
163            println!("! File copy failed: {}", e);
164            return Ok(());
165        }
166    }
167
168    // === Test 6: Verify copied file ===
169    println!("\n=== Test 6: Verify Copied File ===");
170    println!("Listing directory: {}", test_folder_new);
171    wait_for_enter();
172
173    let copied_files = match client.file().list_directory(test_folder_new).await {
174        Ok(files) => {
175            println!("✓ Directory listed!");
176            println!("  Found {} items:", files.len());
177            for file in &files {
178                let type_str = if file.isdir == Some(1) { "DIR" } else { "FILE" };
179                let size_str = if let Some(s) = file.size {
180                    format!("{} bytes", s)
181                } else {
182                    "N/A".to_string()
183                };
184                println!("    [{}] {} ({})", type_str, file.name, size_str);
185            }
186            Some(files)
187        }
188        Err(e) => {
189            println!("! Failed to list directory: {}", e);
190            None
191        }
192    };
193
194    println!("\nChecking copied file: {}", test_file_new);
195    wait_for_enter();
196
197    match client.file().get_file_info(test_file_new).await {
198        Ok(info) => {
199            println!("✓ Copied file verified!");
200            println!("  name: {}", info.name);
201            println!("  size: {:?} bytes", info.size);
202        }
203        Err(e) => {
204            println!("! Failed to verify copied file: {}", e);
205            // If we listed the directory, show available files
206            if let Some(files) = copied_files {
207                println!("  Available files:");
208                for file in files {
209                    println!("    {}", file.name);
210                }
211            }
212            return Ok(());
213        }
214    }
215
216    // === Test 7: Rename file ===
217    println!("\n=== Test 7: Rename File ===");
218    println!("Renaming file: {} -> {}", test_file_new, test_file_renamed);
219    wait_for_enter();
220
221    match client
222        .file()
223        .rename(test_file_new, "subscribe_renamed.json")
224        .await
225    {
226        Ok(_) => println!("✓ File renamed successfully!"),
227        Err(e) => {
228            println!("! File rename failed: {}", e);
229            return Ok(());
230        }
231    }
232
233    // === Test 8: Move file ===
234    println!("\n=== Test 8: Move File ===");
235    println!("Moving file: {} -> {}", test_file_renamed, test_folder);
236    wait_for_enter();
237
238    match client
239        .file()
240        .move_file(test_file_renamed, test_folder)
241        .await
242    {
243        Ok(_) => println!("✓ File moved successfully!"),
244        Err(e) => {
245            println!("! File move failed: {}", e);
246            return Ok(());
247        }
248    }
249
250    // === Test 9: Verify moved file ===
251    println!("\n=== Test 9: Verify Moved File ===");
252    let moved_file_path = "/upload/subscribe_renamed.json";
253    println!("Checking moved file: {}", moved_file_path);
254    wait_for_enter();
255
256    match client.file().get_file_info(moved_file_path).await {
257        Ok(info) => {
258            println!("✓ Moved file verified!");
259            println!("  name: {}", info.name);
260            println!("  path: {}", info.path);
261        }
262        Err(e) => {
263            println!("! Failed to verify moved file: {}", e);
264            return Ok(());
265        }
266    }
267
268    // === Test 10: Delete renamed file ===
269    println!("\n=== Test 10: Delete File ===");
270    println!("Deleting file: {}", moved_file_path);
271    wait_for_enter();
272
273    match client.file().delete(moved_file_path).await {
274        Ok(_) => println!("✓ File deleted successfully!"),
275        Err(e) => {
276            println!("! File deletion failed: {}", e);
277            return Ok(());
278        }
279    }
280
281    // === Test 11: Cleanup - Delete test folder ===
282    println!("\n=== Test 11: Cleanup ===");
283    println!("Deleting empty folder: {}", test_folder_new);
284    wait_for_enter();
285
286    match client.file().delete(test_folder_new).await {
287        Ok(_) => println!("✓ Test folder deleted successfully!"),
288        Err(e) => {
289            println!("! Failed to delete test folder: {}", e);
290            return Ok(());
291        }
292    }
293
294    // === Final verification ===
295    println!("\n=== Final Verification ===");
296    println!("Listing final contents of: {}", test_folder);
297    wait_for_enter();
298
299    match client.file().list_directory(test_folder).await {
300        Ok(files) => {
301            println!("✓ Final directory listing:");
302            println!("  Found {} items:", files.len());
303            for file in files {
304                let type_str = if file.isdir == Some(1) { "DIR" } else { "FILE" };
305                println!("    [{}] {}", type_str, file.name);
306            }
307        }
308        Err(e) => {
309            println!("! Failed to list directory: {}", e);
310            return Ok(());
311        }
312    }
313
314    println!("\n=== All file management tests completed successfully! ===");
315
316    Ok(())
317}
318
319/// Wait for user to press Enter before continuing
320fn wait_for_enter() {
321    println!("Press Enter to continue...");
322    let stdin = io::stdin();
323    let mut lines = stdin.lock().lines();
324    let _ = lines.next();
325}