zlsrs 0.0.2

Rust 标准库扩展工具集,提供更便捷的使用方式
Documentation
//! # 文件操作模块
//!
//! 这个模块提供了文件操作的核心功能,包括文件的创建、读写和删除等操作。
//!
//! ## 主要功能
//!
//! - 文件和目录的创建
//! - 文件内容的读写
//! - 文件和目录的删除
//!
//! ## 示例
//!
//! ```rust
//! use zlsrs::zfile::{create_dir, write_file, read_file, remove};
//!
//! fn main() -> Result<(), Box<dyn std::error::Error>> {
//!     // 创建目录
//!     create_dir("./tmp/test")?;
//!     
//!     // 写入文件
//!     write_file("./tmp/test/hello.txt", "Hello, World!", false)?;
//!     
//!     // 读取文件
//!     let content = read_file("./tmp/test/hello.txt")?;
//!     assert_eq!(content, "Hello, World!");
//!     
//!     // 删除文件和目录
//!     let _ = remove("./tmp/test", false);
//!     
//!     Ok(())
//! }
//! ```

use super::ZPath;
use std::io::{BufReader, BufWriter, Read, Write};

/// 创建文件夹
///
/// 创建指定路径的文件夹,如果文件夹已存在则直接返回成功。
/// 支持创建多级目录。
///
/// # 参数
///
/// * `path` - 要创建的文件夹路径
///
/// # 返回值
///
/// * `Ok(())` - 创建成功
/// * `Err(Box<dyn std::error::Error>)` - 创建失败的错误信息
///
/// # 示例
///
/// ```rust
/// use zlsrs::zfile::create_dir;
///
/// fn main() -> Result<(), Box<dyn std::error::Error>> {
///     create_dir("./tmp/test/subdir")?;
///     Ok(())
/// }
/// ```
pub fn create_dir(path: &str) -> Result<(), Box<dyn std::error::Error>> {
    let path = ZPath::new(path);
    if path.exists() {
        // 如果目录已存在,直接返回成功
        if path.is_dir() {
            return Ok(());
        } else {
            return Err("路径已存在但不是目录".into());
        }
    }
    // 创建多级目录
    std::fs::create_dir_all(path)?;
    Ok(())
}

/// 创建文件
///
/// 创建指定路径的文件,如果文件已存在则返回错误。
/// 如果文件所在的目录不存在,会自动创建目录。
///
/// # 参数
///
/// * `path` - 要创建的文件路径
///
/// # 返回值
///
/// * `Ok(())` - 创建成功
/// * `Err(Box<dyn std::error::Error>)` - 创建失败的错误信息
///
/// # 示例
///
/// ```rust
/// use zlsrs::zfile::create_file;
///
/// fn main() {
///     let _ = create_file("./tmp/test/hello.txt");
/// }
/// ```
pub fn create_file(path: &str) -> Result<(), Box<dyn std::error::Error>> {
    let path = ZPath::new(path);
    if path.exists() {
        return Err("文件已存在".into());
    }

    if let Some(parent) = path.parent() {
        std::fs::create_dir_all(parent)?;
    }

    std::fs::File::create(path)?;
    Ok(())
}

/// 写入文件
///
/// 写入内容到指定的文件。可以选择是追加内容还是覆盖原有内容。
///
/// # 参数
///
/// * `path` - 要写入的文件路径
/// * `content` - 要写入的内容
/// * `is_append` - 是否追加内容到文件末尾
///
/// # 返回值
///
/// * `Ok(())` - 写入成功
/// * `Err(Box<dyn std::error::Error>)` - 写入失败的错误信息
///
/// # 示例
///
/// ```rust
/// use zlsrs::zfile::write_file;
///
/// fn main() -> Result<(), Box<dyn std::error::Error>> {
///     // 覆盖写入
///     write_file("./tmp/test.txt", "Hello", false)?;
///     // 追加写入
///     write_file("./tmp/test.txt", ", World!", true)?;
///     Ok(())
/// }
/// ```
pub fn write_file(
    path: &str,
    content: &str,
    is_append: bool,
) -> Result<(), Box<dyn std::error::Error>> {
    let path = ZPath::new(path);
    let file = if is_append {
        std::fs::OpenOptions::new()
            .create(true)
            .append(true)
            .open(path)?
    } else {
        std::fs::File::create(path)?
    };

    let mut writer = BufWriter::new(file);
    writer.write_all(content.as_bytes())?;
    writer.flush()?;
    Ok(())
}

/// 读取文件
///
/// 读取指定文件的内容。如果文件不存在,则返回空字符串。
///
/// # 参数
///
/// * `path` - 要读取的文件路径
///
/// # 返回值
///
/// * `Ok(String)` - 读取成功,返回文件内容
/// * `Err(Box<dyn std::error::Error>)` - 读取失败的错误信息
///
/// # 示例
///
/// ```rust
/// use zlsrs::zfile::read_file;
///
/// fn main() -> Result<(), Box<dyn std::error::Error>> {
///     let content = read_file("./tmp/test.txt")?;
///     println!("文件内容: {}", content);
///     Ok(())
/// }
/// ```
pub fn read_file(path: &str) -> Result<String, Box<dyn std::error::Error>> {
    let path = ZPath::new(path);
    if !path.exists() {
        return Ok(String::new());
    }

    let file = std::fs::File::open(path)?;
    let mut reader = BufReader::new(file);
    let mut content = String::new();
    reader.read_to_string(&mut content)?;
    Ok(content)
}

/// 删除文件或目录
///
/// 删除指定的文件或目录。如果是目录,可以选择是否保留目录本身。
///
/// # 参数
///
/// * `path` - 要删除的文件或目录路径
/// * `keep_dir` - 如果是目录,是否保留目录本身
///
/// # 返回值
///
/// * `Ok(())` - 删除成功
/// * `Err(Box<dyn std::error::Error>)` - 删除失败的错误信息
///
/// # 示例
///
/// ```rust
/// use zlsrs::zfile::remove;
///
/// fn main() -> Result<(), Box<dyn std::error::Error>> {
///     // 删除文件
///     let _ = remove("./tmp/test.txt", false);
///     // 删除目录及其内容,但保留目录本身
///     let _ = remove("./tmp/test_dir", true);
///     Ok(())
/// }
/// ```
pub fn remove(path: &str, keep_dir: bool) -> Result<(), Box<dyn std::error::Error>> {
    let path = ZPath::new(path);
    if path.is_dir() {
        if keep_dir {
            for entry in std::fs::read_dir(&path)? {
                let entry = entry?;
                let path = entry.path();
                if path.is_dir() {
                    std::fs::remove_dir_all(path)?;
                } else {
                    std::fs::remove_file(path)?;
                }
            }
        } else {
            std::fs::remove_dir_all(path)?;
        }
    } else {
        std::fs::remove_file(path)?;
    }
    Ok(())
}