Skip to main content

list_all/
list_all.rs

1use baidu_netdisk_sdk::BaiduNetDiskClient;
2use log::info;
3
4fn format_size(bytes: u64) -> String {
5    if bytes < 1024 {
6        format!("{} B", bytes)
7    } else if bytes < 1024 * 1024 {
8        format!("{:.2} KB", bytes as f64 / 1024.0)
9    } else if bytes < 1024 * 1024 * 1024 {
10        format!("{:.2} MB", bytes as f64 / (1024.0 * 1024.0))
11    } else {
12        format!("{:.2} GB", bytes as f64 / (1024.0 * 1024.0 * 1024.0))
13    }
14}
15
16#[tokio::main]
17async fn main() -> Result<(), Box<dyn std::error::Error>> {
18    env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
19
20    let client = BaiduNetDiskClient::builder().build()?;
21    info!("Client created successfully");
22
23    client.load_token_from_env()?;
24    info!("Token loaded successfully");
25
26    let test_dir = "/apps/chapters";
27    let page_size = 10;
28
29    println!("=== Baidu NetDisk ListAll Test ===");
30    println!("Directory: {}", test_dir);
31    println!("Page size: {}\n", page_size);
32
33    let mut start = 0;
34    let mut page_num = 1;
35    let mut total_files = 0;
36    let mut has_more = true;
37
38    while has_more {
39        // 使用简化的 list_all 方法,默认开启递归
40        match client.file().list_all(test_dir, start, page_size).await {
41            Ok(result) => {
42                has_more = result.has_more;
43
44                println!("--- Page {} ---", page_num);
45                println!("Found {} files in this page", result.list.len());
46
47                for file in &result.list {
48                    let size_str = file
49                        .size
50                        .map(|s| format_size(s))
51                        .unwrap_or_else(|| "N/A".to_string());
52                    let is_dir = file.isdir.map(|i| i == 1).unwrap_or(false);
53                    let file_type = if is_dir { "DIR" } else { "FILE" };
54
55                    println!("  [{}] {} ({})", file_type, file.name, size_str);
56                }
57
58                total_files += result.list.len();
59
60                if has_more {
61                    println!("\nPress Enter to continue to page {}...", page_num + 1);
62                    println!("Next cursor: {:?}", result.cursor);
63                    // 使用 cursor 作为下一页的 start,用户无需手动计算
64                    if let Some(cursor) = result.cursor {
65                        start = cursor as i32;
66                    }
67                    let mut input = String::new();
68                    std::io::stdin().read_line(&mut input)?;
69                }
70                page_num += 1;
71            }
72            Err(e) => {
73                println!("Error: {}", e);
74                break;
75            }
76        }
77    }
78
79    println!("\n=== ListAll Test Completed ===");
80    println!("Total files found: {}", total_files);
81
82    Ok(())
83}