读取指定目录下所有文件夹和文件的路径
mrpmc 2014-08-20 03:06:18 using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;
using System.Diagnostics;
using System.Security.AccessControl;
namespace 文檔路徑讀取
{
public partial class Form1 : Form
{
public static string url;
public Form1()
{
InitializeComponent();
read();
}
private void button1_Click(object sender, EventArgs e)//選擇文件夾
{
folderBrowserDialog1.RootFolder = Environment.SpecialFolder.Desktop;
folderBrowserDialog1.Description = "請選擇文件夾";
folderBrowserDialog1.ShowNewFolderButton = false;
DialogResult d = folderBrowserDialog1.ShowDialog();
if (d == DialogResult.OK)
{
url = folderBrowserDialog1.SelectedPath;
label1.Text = folderBrowserDialog1.SelectedPath;
label1.Visible = true;
button2.Visible = true;
}
else
label1.Text = "請選擇目錄!";
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)//开启子线程读取文件夹下所有文件夹和文件路径
{
listBox1.Items.Clear();
this.label5.Text = "0";
ThreadWithState tws = new ThreadWithState(this);
Thread t = new Thread(new ThreadStart(tws.check));
t.Start();
}
public void AddItems(string text)//把路径添加到listbox中
{
if (this.listBox1.InvokeRequired)
{
Action a = () => AddItems(text);
this.listBox1.BeginInvoke(a);
}
else
{
this.listBox1.Items.Add(text);
}
}
public void SetCount()//统计文件夹和文件数量
{
if (this.label5.InvokeRequired)
{
Action a = () => this.label5.Text = this.listBox1.Items.Count.ToString();
this.label5.BeginInvoke(a);
}
else
{
this.label5.Text = this.listBox1.Items.Count.ToString(); ;
}
}
public void save()//把listbox的内容保存到当前程序目录下的save.txt文档
{
if (this.InvokeRequired)
{
Action a = () => save();
this.BeginInvoke(a);
}
else
{
string s = "";
StringBuilder saveString = new StringBuilder();
for (int i = 0; i < this.listBox1.Items.Count; i++)
{
s = this.listBox1.Items[i].ToString();;
saveString = saveString.Append(s).Append("}split{");
}
saveString = saveString.Remove(saveString.Length - 7, 7);//删除最后一个"}split{"
File.WriteAllText(Application.StartupPath + "\\save.txt", saveString.ToString());
}
}
public void read()//读取save.txt内容
{
try
{
string ReadString = "";
ReadString = File.ReadAllText(Application.StartupPath + "\\save.txt");
listBox1.Items.AddRange(ReadString.Split(new string[] { "}split{" }, StringSplitOptions.None));
label5.Text = listBox1.Items.Count.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
//ThreadWithState 类里包含了将要执行的任务以及执行任务的方法
public class ThreadWithState
{
Form1 form;//= new Form1();
public bool Finish;
public ThreadWithState(Form1 form)
{
this.form = form;
}
public void check()
{
try
{
getAllFiles(Form1.url);
form.save();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
public void getAllFiles(string directory) //获取指定的目录中的所有文件(包括文件夹)
{
try
{
getFiles(directory);//获取指定的目录中的所有文件(不包括文件夹)
getDirectory(directory);//获取指定的目录中的所有目录(文件夹)
form.SetCount();// form.label5.Text = form.listBox1.Items.Count.ToString();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
public void getFiles(string directory) //获取指定的目录中的所有文件(不包括文件夹)
{
string[] path = System.IO.Directory.GetFiles(directory);
for (int i = 0; i < path.Length; i++)
{
try
{
form.AddItems(path[i]);// form.listBox1.Items.Add(path[i]);;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
public void getDirectory(string directory) //获取指定的目录中的所有目录(文件夹)
{
string[] directorys = System.IO.Directory.GetDirectories(directory);
if (directorys.Length <= 0) //如果该目录中没有其他文件夹
form.AddItems( directory);// form.listBox1.Items.Add(directory);
else
{
for (int i = 0; i < directorys.Length; i++)
{
try
{
getAllFiles(directorys[i]);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
}
}
读取一写文件夹路径没有任何问题,但读取我电脑上面E盘,第一次可以成功读取E盘下所有文件夹和文件的路径并可以保存,但再读E盘的文件夹,可以读取到所有文件和文件夹路径到listbox,但没有办法保存到save.txt文档,必须重启电脑才能保存。求解!!!万分感激。