Tạo một file batch chạy lệnh cmd bằng C# để dọn dẹp thư mục

Mình có một đoạn code như sau:

private void btDonDepSolution_Click(object sender, EventArgs e)
        {
            string path = fbdDuongDan.SelectedPath;
            if (path[path.Length - 1] != '\\') path = path + "\\";
            StreamWriter Progress = new StreamWriter("Progress.bat");
            Progress.WriteLine(@"Câu lệnh cmd 1");
            Progress.WriteLine(@"Câu lệnh cmd 2");
            ...
            Progress.WriteLine(@"Câu lệnh cmd z");
            Progress.Close();
            Process.Start("Progress.bat");
            while
                (File.Exists("Progress.bat"))
                try
                {
                    File.Delete("Progress.bat");
                }
            catch
                {
                }
        }

Mình có một thư mục tên là C:\Solution
Trong thư mục Solution có các thư mục Project1, Project2, Project3…, Projectn
Mỗi thư mục Project1,2,3… có một thư mục obj và một thư mục bin
Khi click vào btDonDepSolution thì xoá tất cả các thư mục obj và bin biết rằng chúng không rỗng.
z với n là các số khác nhau, các thư mục “Project” có thể có tên rất khác nhau và fbdDuongDan.SelectedPath==“C:\Solution”

Cái đoạn sinh câu lệnh cmd ở giữa StreamWriter Progress = new StreamWriter(“Progress.bat”); và Process.Start(“Progress.bat”); mình ko biết viết thế nào do không thạo cmd. Ai chỉ cho mình vụ này với

Dùng luôn System.IO của C# mà xoá. Khỏi cmd làm gì cho nó nhì nhằng ra.

Cái đó mình làm được rồi :smile:
Mình nghĩ là cmd có lệnh del <file> /s /q thì việc xoá file bằng file .bat sẽ nhanh hơn là dùng foreach trong C# khi cần xoá số lượng lớn (cỡ 2000 files *.user đặt trong đủ các subfolder với nhiều cấp độ khác nhau chẳng hạn)

Đấy chỉ là bạn nghĩ thôi :slight_smile:

1 Like

À, thế tiện trong post này mình hỏi luôn, mọi người đánh giá lối viết code này là sáng sủa hay “tối sủa”…

namespace Visual_Studio_2013_Solution_Cleaner
{
    public partial class MainForm : System.Windows.Forms.Form
    {
        int X, Y;
        public MainForm()
        {
            InitializeComponent();
        }
        private void MainForm_Load(object sender, System.EventArgs e)
        {
            fbdDuongDan.SelectedPath = System.IO.Directory.GetCurrentDirectory();
            lbDuongDan.Text = "(Bấm vào đường dẫn, bấm \"S\" hoặc kéo thả thư mục chứa Solution vào để chọn thư mục solution)\n" + fbdDuongDan.SelectedPath;
        }
        private void MainForm_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            X = e.X;
            Y = e.Y;
        }
        private void MainForm_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (e.Button == System.Windows.Forms.MouseButtons.Left)
            {
                Left = Left + e.X - X;
                Top = Top + e.Y - Y;
            }
        }
        private void lbDuongDan_Click(object sender, System.EventArgs e)
        {
            fbdDuongDan.ShowDialog();
            lbDuongDan.Text = "(Bấm vào đường dẫn, bấm \"S\" hoặc kéo thả thư mục chứa Solution vào để chọn thư mục solution)\n" + fbdDuongDan.SelectedPath;
        }
        private void MainForm_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            if (e.KeyChar == 's')
            {
                fbdDuongDan.ShowDialog();
                lbDuongDan.Text = "(Bấm vào đường dẫn, bấm \"S\" hoặc kéo thả thư mục chứa Solution vào để chọn thư mục solution)\n" + fbdDuongDan.SelectedPath;
            }
        }
        private void MainForm_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
        {
            if (System.IO.Directory.Exists(((string[])e.Data.GetData(System.Windows.Forms.DataFormats.FileDrop))[0]))
                e.Effect = System.Windows.Forms.DragDropEffects.Move;
            else
                e.Effect = System.Windows.Forms.DragDropEffects.None;
        }
        private void MainForm_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
        {
            fbdDuongDan.SelectedPath = ((string[])e.Data.GetData(System.Windows.Forms.DataFormats.FileDrop))[0];
            lbDuongDan.Text = "(Bấm vào đường dẫn, bấm \"S\" hoặc kéo thả thư mục chứa Solution vào để chọn thư mục solution)\n" + fbdDuongDan.SelectedPath;
        }
        private void GetFolderList(string FolderPath, System.Collections.Generic.List<string> Files, System.Collections.Generic.List<string> Folders)
        {
            foreach (string File in System.IO.Directory.GetFiles(FolderPath))
                Files.Add(File);
            foreach (string SubFolder in System.IO.Directory.GetDirectories(FolderPath))
            {
                Folders.Add(SubFolder);
                GetFolderList(SubFolder, Files, Folders);
            }
        }
        private void btDonDepSolution_Click(object sender, System.EventArgs e)
        {
            pbDonDepSolution.Value = 0;
            pbDonDepSolution.Visible = true;
            var Files = new System.Collections.Generic.List<string>();
            var Folders = new System.Collections.Generic.List<string>();
            GetFolderList(fbdDuongDan.SelectedPath, Files, Folders);
            pbDonDepSolution.Maximum = Files.Count + Folders.Count;
            foreach (string FileToDelete in Files)
                if (FileToDelete.EndsWith(".suo") || FileToDelete.EndsWith(".user") || FileToDelete.EndsWith(".Debug.config") || FileToDelete.EndsWith(".Release.config") || FileToDelete.EndsWith(".sdf"))
                    try
                    {
                        System.IO.File.Delete(FileToDelete);
                    }
                    catch
                    {
                    }
                    finally
                    {
                        pbDonDepSolution.Value = pbDonDepSolution.Value + 1;
                    }
            foreach (string FolderToDelete in Folders)
                if (FolderToDelete.EndsWith(@"\bin") || FolderToDelete.EndsWith(@"\obj") || FolderToDelete.EndsWith(@"\Debug") || FolderToDelete.EndsWith(@"\Release") || FolderToDelete.EndsWith(@"\x86"))
                    try
                    {
                        System.IO.Directory.Delete(FolderToDelete, true);
                    }
                    catch
                    {
                    }
                    finally
                    {
                        pbDonDepSolution.Value = pbDonDepSolution.Value + 1;
                    }
            pbDonDepSolution.Visible = false;
            if (cbTatKhiChayXong.Checked)
                Close();
        }
        private void btThoat_Click(object sender, System.EventArgs e)
        {
            Close();
        }
    }
}
  1. Hàm MainForm_MouseMove nên thay bang override của MouseLeftButtonDown và gọi hàm DragMove.
  2. Hàm MainForm_DragEnter sao cả if và else đều thực hiện một công việc như nhau ???
1 Like

Tùy trường hợp. Trong trường hợp file/dir quá nhiều thì batch luôn nhanh hơn. Cả Unix và DOS đều vậy.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?