遍历目录 获取所有文件(100分)

  • 主题发起人 主题发起人 hlei
  • 开始时间 开始时间
H

hlei

Unregistered / Unconfirmed
GUEST, unregistred user!
获取指定目录中的所有文件,包括子目录中的。
private static string[] GetAllFiles(string path)
{
string[] Files = System.IO.Directory.GetFiles(path);
string[] Dirs = System.IO.Directory.GetDirectories(path);
foreach (string Dir in Dirs)
{
GetAllFiles(Dir);
}
return Files;
}
上面这个返回值为什么只是目录的文件,没有递归子目录的
还有一个问题就是。string[]与string[]类型怎么相加,
在DELPHI里可以使用 .AddStrings(),那C#怎么写?
 
1:子目录的需要自己写代码来实现,就是你说的用递归!
2:至于拷贝数组可以用
Array.Copyto(..,..,..)
来做,实现也比Delphi的灵活的多,具体可以看帮助
 
http://www.2ccc.com/article.asp?articleid=2900
它详细的遍里了整个系统的文件
可以看看
 
网事如风,所说的 1:子目录的需要自己写代码来实现,就是你说的用递归!
是不对的,其实我上面的代码已经可以现实递归,只是不知道返回值该怎么写
例如,我把代码改一下
private void GetAllFiles(string path)
{
string[] Files = System.IO.Directory.GetFiles(path);
string[] Dirs = System.IO.Directory.GetDirectories(path);
foreach (string file in Files)
{
listbox1.items.all(file);
//这样就可以显示里所有文件
}
foreach (string Dir in Dirs)
{
GetAllFiles(Dir);
}
}
但我不知道该怎么写,把所有找到的Files做为返回值.
 
把邮箱告诉我
我发一个
 
sbzldlb,你说的DELPHI的。我以前就用DELPHI写过,不过现在是想知道C#怎么写
 
那我就没用过了,不好意思
 
镜中雪月,我的EMAIL是 HLei_Mail@126.com
谢谢
 
procedure TForm1.Button1Click(Sender: TObject);
begin
treeview1.Items.Clear;
getallpath(edit1.text,treenode,true);
//同时取子目录下的文件及目录名
//getallpath(edit1.text,treenode,false);
不取子目录下的文件及目录名
end;
procedure Tform1.getallpath(path:string;treenode:ttreenode;subdir:boolean);
var
int:integer;
SRec: TSearchRec;
treenode2:ttreenode;
begin
int:=findfirst(path+'/*.*',faAnyFile,SRec);
while int<>18do
begin
if (srec.Attr=16) then
begin
if (SREC.NAME<>'.') AND (SREC.NAME<>'..') then
begin
treenode2:=treeview1.Items.Addchild(treenode,srec.Name);
if subdir then
GETALLPATH(path+'/'+SRec.Name,treenode2,subdir);
end
end
else
begin
treenode2:=treeview1.Items.Addchild(treenode,srec.Name);
end;
int:=FindNext(SRec);
end;
end;
 
镜中雪月,怎么你的也是delphi的。我是要C#。
呵。
 
private static void GetAllFiles(ref ArrayList s_path,string path)
{
string[] Files = System.IO.Directory.GetFiles(path);
string[] Dirs = System.IO.Directory.GetDirectories(path);
foreach (string Dir in Dirs)
{
s_path.add(dir);
GetAllFiles(ref s_path,Dir);
}
}
用輸出參數s_path就可以了
 
哦,我没仔细你的代码,Sorry,Sorry, 是实现了递归调用,呵呵
来改一下子:
private void GetAllFiles(ref ArrayList FileList;
string path)
{
string[] Files = System.IO.Directory.GetFiles(path);
string[] Dirs = System.IO.Directory.GetDirectories(path);
foreach (string file in Files)
{
//listbox1.items.all(file);
//这样就可以显示里所有文件
FileList.add( file );
}
foreach (string Dir in Dirs)
{
GetAllFiles(Dir);
}
}
使用时候,需要如下声明:
ArrayList FileList = new ArrayList();
GetAllFiles(ref FileList, path);
然后:
for ( int i := 0;
i< FileList.Count;
i++)
{
listbox1.items.add( (string)(FileList) );
}
代码没有调试,不过实现是这样的了
 
转贴一篇文章:
C#实现的列出目录下所有子目录和文件的程序(附思路)
作者: fanz2000
把自己的资料刻录成很多光盘,发现连自己都很难找到需要的文件在哪张光盘上,因此我就根据需求,在Visual Studio.NET中写了一个列出目录下所有子目录和文件的程序,以方便我列出刻录的资料光盘上的所有文件信息。
本程序的主要算法是递归,主函数如下:
//递归列出目录下的所有文件和子目录
public void ListFiles( FileSystemInfo fileinfo )
{
if( ! fileinfo.Exists ) return;
DirectoryInfo dirinfo = fileinfo as DirectoryInfo;
if(dirinfo == null ) return;
//不是目录
indent++;//缩进加一
FileSystemInfo [] files = dirinfo.GetFileSystemInfos();
for( int i=0;
i< i++)>遍历目录下所有文件、子目录
{
FileInfo file = files as FileInfo;
if( file != null ) // 是文件
{
this.richTextBox1.Text+=(WriteSpace(indent)+"|-"+
file.Name + "/t" + ConvertToKByte(file.Length)+"/r" );
}
else
//是目录
{
this.richTextBox1.Text+=(WriteSpace(indent)+"+"+files.FullName+"/r");
ListFiles( files );
//对子目录进行递归调用
}
}
indent--;//缩进减一
}

程序的设计界面如下图所示:

控件有两个Button控件btnSelect和btnSave(分别用来选择目录和保存文件);一个RichTextBox控件(显示结果),一个folderBrowserDialog控件(选择目录)和一个saveFileDialog控件(选择保存文件路径)。

程序运行后的界面如下图所示:





程序的完整代码如下:(其中红色的是我自己添加的)

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

using System.Globalization;

using System.IO;



namespace ListFile_Windows

{

///

/// Form1 的摘要说明。

///

public class Form1 : System.Windows.Forms.Form

{

private System.Windows.Forms.RichTextBox richTextBox1;

public static int indent;
//缩进值

private System.Windows.Forms.Button btnSelect;

private System.Windows.Forms.Button btnSave;

private System.Windows.Forms.FolderBrowserDialog folderBrowserDialog1;

private System.Windows.Forms.SaveFileDialog saveFileDialog1;

///

/// 必需的设计器变量。

///

private System.ComponentModel.Container components = null;



public Form1()

{

//

// Windows 窗体设计器支持所必需的

//

InitializeComponent();



//

// TODO: 在 InitializeComponent 调用后添加任何构造函数代码

//

}



///

/// 清理所有正在使用的资源。

///

protected override void Dispose( bool disposing )

{

if( disposing )

{

if (components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}



#region Windows 窗体设计器生成的代码

///

/// 设计器支持所需的方法 - 不要使用代码编辑器修改

/// 此方法的内容。

///

private void InitializeComponent()

{

this.richTextBox1 = new System.Windows.Forms.RichTextBox();

this.btnSelect = new System.Windows.Forms.Button();

this.btnSave = new System.Windows.Forms.Button();

this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog();

this.saveFileDialog1 = new System.Windows.Forms.SaveFileDialog();

this.SuspendLayout();

//

// richTextBox1

//

this.richTextBox1.Location = new System.Drawing.Point(0, 0);

this.richTextBox1.Name = "richTextBox1";

this.richTextBox1.Size = new System.Drawing.Size(528, 400);

this.richTextBox1.TabIndex = 0;

this.richTextBox1.Text = "";

//
// btnSelect
//
this.btnSelect.Location = new System.Drawing.Point(112, 424);
this.btnSelect.Name = "btnSelect";
this.btnSelect.TabIndex = 1;
this.btnSelect.Text = "选择目录";
this.btnSelect.Click += new System.EventHandler(this.btnSelect_Click);
//
// btnSave
//
this.btnSave.Location = new System.Drawing.Point(320, 424);
this.btnSave.Name = "btnSave";
this.btnSave.TabIndex = 2;
this.btnSave.Text = "保存文件";
this.btnSave.Click += new System.EventHandler(this.btnSave_Click);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(528, 461);
this.Controls.Add(this.btnSave);
this.Controls.Add(this.btnSelect);
this.Controls.Add(this.richTextBox1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
}
#endregion
///
/// 应用程序的主入口点。
///
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
//递归列出目录下的所有文件和子目录
public void ListFiles( FileSystemInfo fileinfo )
{
if( ! fileinfo.Exists ) return;
DirectoryInfo dirinfo = fileinfo as DirectoryInfo;
if( dirinfo == null ) return;
//不是目录
indent++;//缩进加一
FileSystemInfo [] files = dirinfo.GetFileSystemInfos();
for( int i=0;
i< i++)>遍历目录下所有文件、子目录
{
FileInfo file = files as FileInfo;
if( file != null ) // 是文件
{
this.richTextBox1.Text+=(WriteSpace(indent)+"|-"+
file.Name + "/t" + ConvertToKByte(file.Length)+"/r" );
}
else
//是目录
{
this.richTextBox1.Text+=(WriteSpace(indent)+"+"+files.FullName+"/r");
ListFiles( files );
//对子目录进行递归调用
}
}
indent--;//缩进减一
}
//控制缩进空格,n为空格数
public string WriteSpace(int n)
{
string strspace="";
for(int i=1;i<=n;i++)
strspace+=" ";
return strspace;
}
//显示文件字节数
public string ConvertToKByte(long len)
{
float val;
NumberFormatInfo myNfi = new NumberFormatInfo();
myNfi.NumberDecimalDigits=1;
//显示一位小数
if(len/1024==0)
return len.ToString()+"字节";
if(len/1024/1024==0)
{
val=(float)len/1024;

return val.ToString("N",myNfi)+"K字节";
}
val=(float)len/1024/1024;
return val.ToString("N",myNfi)+"M字节";
}
private void btnSelect_Click(object sender, System.EventArgs e)
{
indent=0;//缩进清零
this.richTextBox1.ResetText();
//清空文本框中的原来的文本
//选择目录
if(this.folderBrowserDialog1.ShowDialog()==DialogResult.OK)
{
ListFiles(new DirectoryInfo(this.folderBrowserDialog1.SelectedPath));
}
}
private void btnSave_Click(object sender, System.EventArgs e)
{
if(this.saveFileDialog1.ShowDialog()==DialogResult.OK)
{
//保存结果文件
this.richTextBox1.SaveFile(saveFileDialog1.FileName,RichTextBoxStreamType.PlainText);
}
}
}
 
下面的已经通过编译和运行:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace C_dir
{
/// <summary>
/// Summary description for WinForm.
/// </summary>
public class WinForm : System.Windows.Forms.Form
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.ListBox listBox1;
public WinForm()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
}

private static void GetAllFiles(ref ArrayList s_path,string path)
{
string[] Files = System.IO.Directory.GetFiles(path);
string[] Dirs = System.IO.Directory.GetDirectories(path);
foreach (string file in Files)
{
s_path.Add( file );
}
foreach (string Dir in Dirs)
{
GetAllFiles(ref s_path, Dir);
}
}

/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support -do
not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.listBox1 = new System.Windows.Forms.ListBox();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(8, 16);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// listBox1
//
this.listBox1.ItemHeight = 12;
this.listBox1.Location = new System.Drawing.Point(104, 16);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(360, 304);
this.listBox1.TabIndex = 1;
//
// WinForm
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(504, 349);
this.Controls.Add(this.listBox1);
this.Controls.Add(this.button1);
this.Name = "WinForm";
this.Text = "WinForm";
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new WinForm());
}

private void button1_Click(object sender, System.EventArgs e)
{
ArrayList FileList = new ArrayList();
string path = "c://mysql";
GetAllFiles(ref FileList, path);
for ( int i = 0;
i< FileList.Count;
i++)
{
listBox1.Items.Add( (string)(FileList) );
}
}
}
}
 
谢谢各位的关注。问题已解决,结贴!
 
后退
顶部