Procházet zdrojové kódy

使用cp -r来复制目录 (#23)

* 使用cp -r来复制目录
裕依 před 1 rokem
rodič
revize
0fad16c1b7
1 změnil soubory, kde provedl 25 přidání a 15 odebrání
  1. 25 15
      src/utils/file.rs

+ 25 - 15
src/utils/file.rs

@@ -1,7 +1,13 @@
-use std::{fs::File, path::Path};
+use std::{
+    fs::File,
+    path::Path,
+    process::{Command, Stdio},
+};
 
 use reqwest::{blocking::ClientBuilder, Url};
 
+use super::stdio::StdioUtils;
+
 pub struct FileUtils;
 
 impl FileUtils {
@@ -40,20 +46,24 @@ impl FileUtils {
 
     /// 递归地复制给定目录下所有文件到另一个文件夹中
     pub fn copy_dir_all(src: &Path, dst: &Path) -> Result<(), String> {
-        if src.is_dir() {
-            std::fs::create_dir_all(dst).map_err(|e| e.to_string())?;
-            for entry in std::fs::read_dir(src).map_err(|e| e.to_string())? {
-                let entry = entry.map_err(|e| e.to_string())?;
-                let path = entry.path();
-                let dst_path = dst.join(path.file_name().unwrap());
-                if path.is_dir() {
-                    FileUtils::copy_dir_all(&path, &dst_path).map_err(|e| e.to_string())?;
-                } else {
-                    std::fs::copy(&path, &dst_path).map_err(|e| e.to_string())?;
-                }
-            }
-        } else {
-            return Err(format!("No such source directory:{:?}", src));
+        let mut cmd = Command::new("cp");
+        cmd.arg("-r").arg("./").arg(dst);
+
+        cmd.current_dir(src);
+
+        // 创建子进程,执行命令
+        let proc: std::process::Child = cmd
+            .stderr(Stdio::piped())
+            .spawn()
+            .map_err(|e| e.to_string())?;
+        let output = proc.wait_with_output().map_err(|e| e.to_string())?;
+
+        if !output.status.success() {
+            return Err(format!(
+                "copy_dir_all failed, status: {:?},  stderr: {:?}",
+                output.status,
+                StdioUtils::tail_n_str(StdioUtils::stderr_to_lines(&output.stderr), 5)
+            ));
         }
         Ok(())
     }