ASP.NET 报表软件 南京袁永福

擎天天博报表软件,支持B/S、C/S、ASP.NET,支持微软.NET1.1/2.0/3.0
袁永福 江西九江人 2001年东南大学动力系毕业 电子邮箱:yyf9989@hotmail.com QQ群:41118220

C#使用WIN32API来高效率的遍历文件和目录

我们有时需要遍历某个目录下的文件和子目录,可以使用System.IO.DirectoryInfo.GetDirectories或GetFiles来获得目录下的所有的文件和子目录,当这个目录下的内容比较多时,这个操作就比较耗时间,有时我们仅仅需要知道某个目录下是否有子目录,这样的操作显然是浪费时间的。此时我们很容易想到三个Win32API函数 FindFirstFile,FindNextFile和FindClose。这三个API搭配使用就能遍历文件和子目录了,而且可以遍历的时候随时中止,避免无谓的操作。

C#中可以使用foreach来遍历某个序列,遍历使用的对象必须实现 System.Collections.IEnumeable接口,而内部调用的遍历器则必须实现System.Collections.IEnumerator , 为了使用方便,我们在使用FindFirstFile等API函数时封装为 IEnumerator,而且实际上是有条件封装的。

这里很多人就会提到C#调用API的执行效率问题,认为应当用C,C++调用API才是正道,使用C#调用则有些鸡肋。但在我个人编程经历中,也有不少调用API的,经验发现其实效率问题不大,可以省略。我只是做常规的运行在PC机上面的软件,CPU通常超过1GHZ,而且无需考虑高实时性和高效率。若过于考虑效率问题会加大软件开发消耗。从工程开发管理方面看是不合理的。我应当解决比较突出的效率问题,不突出的影响不大的效率问题有时间才去解决。使用C#封装Win32API必然会降低执行效率,但是封装后使用方便快捷,综合考虑认为这是正确的。

这里说一下“技术镀金”这个问题,所谓技术镀金就是开发人员在项目软件开发中过于追求技术的完美性,试图在技术上镀上一层完美的金壳,导致软件开发工作量加大,项目时间拉长,有可能导致项目的失败。我吃过“技术镀金”的苦头,现在我内心是追求完美的,但实际开发时经常有意压制追求完美的心思。

现在继续探讨封装大计,本次封装重点在于实现IEnumerator,而IEnumeable只是IEnumerator的一个包装。IEnumerator实现方法 Reset , MoveNext 和属性 Current,Reset方法用于重新设置遍历器,MoveNext用于查找下一个文件或目录,而Current返回当前文件或目录。

这个遍历器还得注意FindClose的调用,必须在遍历完毕没有找到文件或子目录后调用,若不调用该API函数则会造成内存泄漏。

根据上述设计,我写出如下代码,这段代码功能单一,希望有人能用得上

 

/// <summary>
/// 文件或目录遍历器,本类型为 FileDirectoryEnumerator 的一个包装
/// </summary>
/// <remarks>
/// 
/// 编写 袁永福 ( http://www.xdesigner.cn )2006-12-8
/// 
/// 以下代码演示使用这个文件目录遍历器
/// 
/// FileDirectoryEnumerable e = new FileDirectoryEnumerable();
/// e.SearchPath = @"c:\";
/// e.ReturnStringType = true ;
/// e.SearchPattern = "*.exe";
/// e.SearchDirectory = false ;
/// e.SearchFile = true;
/// foreach (object name in e)
/// {
///     System.Console.WriteLine(name);
/// }
/// System.Console.ReadLine();
/// 
///</remarks>
public class FileDirectoryEnumerable : System.Collections.IEnumerable
{
    
private bool bolReturnStringType = true;
    
/// <summary>
    
/// 是否以字符串方式返回查询结果,若返回true则当前对象返回为字符串,
    
/// 否则返回 System.IO.FileInfo或System.IO.DirectoryInfo类型
    
/// </summary>
    public bool ReturnStringType
    {
        
get { return bolReturnStringType; }
        
set { bolReturnStringType = value; }
    }

    
private string strSearchPattern = "*";
    
/// <summary>
    
/// 文件或目录名的通配符
    
/// </summary>
    public string SearchPattern
    {
        
get { return strSearchPattern; }
        
set { strSearchPattern = value; }
    }
    
private string strSearchPath = null;
    
/// <summary>
    
/// 搜索路径,必须为绝对路径
    
/// </summary>
    public string SearchPath
    {
        
get { return strSearchPath; }
        
set { strSearchPath = value; }
    }

    
private bool bolSearchForFile = true;
    
/// <summary>
    
/// 是否查找文件
    
/// </summary>
    public bool SearchForFile
    {
        
get { return bolSearchForFile; }
        
set { bolSearchForFile = value; }
    }
    
private bool bolSearchForDirectory = true;
    
/// <summary>
    
/// 是否查找子目录
    
/// </summary>
    public bool SearchForDirectory
    {
        
get { return bolSearchForDirectory; }
        
set { bolSearchForDirectory = value; }
    }

    
private bool bolThrowIOException = true;
    
/// <summary>
    
/// 发生IO错误时是否抛出异常
    
/// </summary>
    public bool ThrowIOException
    {
        
get { return this.bolThrowIOException; }
        
set { this.bolThrowIOException = value; }
    }
    
/// <summary>
    
/// 返回内置的文件和目录遍历器
    
/// </summary>
    
/// <returns>遍历器对象</returns>
    public System.Collections.IEnumerator GetEnumerator()
    {
        FileDirectoryEnumerator e 
= new FileDirectoryEnumerator();
        e.ReturnStringType 
= this.bolReturnStringType;
        e.SearchForDirectory 
= this.bolSearchForDirectory;
        e.SearchForFile 
= this.bolSearchForFile;
        e.SearchPath 
= this.strSearchPath;
        e.SearchPattern 
= this.strSearchPattern;
        e.ThrowIOException 
= this.bolThrowIOException;
        myList.Add(e);
        
return e;
    }
    
/// <summary>
    
/// 关闭对象
    
/// </summary>
    public void Close()
    {
        
foreach (FileDirectoryEnumerator e in myList)
        {
            e.Close();
        }
        myList.Clear();
    }

    
private System.Collections.ArrayList myList = new System.Collections.ArrayList();

}
//public class FileDirectoryEnumerable : System.Collections.IEnumerable

/// <summary>
/// 文件和目录的遍历器
/// </summary>
/// <remarks>本对象为Win32API函数 FindFirstFile , FindNextFile 
/// 和 FindClose 的一个包装
/// 
/// 以下代码演示使用了 FileDirectoryEnumerator 
/// 
/// FileDirectoryEnumerator e = new FileDirectoryEnumerator();
/// e.SearchPath = @"c:\";
/// e.Reset();
/// e.ReturnStringType = true ;
/// while (e.MoveNext())
/// {
///     System.Console.WriteLine
///         ( e.LastAccessTime.ToString("yyyy-MM-dd HH:mm:ss")
///         + "   " + e.FileLength + "  \t" + e.Name );
/// }
/// e.Close();
/// System.Console.ReadLine();
/// 
/// 编写 袁永福 ( http://www.xdesigner.cn )2006-12-8</remarks>
public class FileDirectoryEnumerator : System.Collections.IEnumerator
{
    
    
#region 表示对象当前状态的数据和属性 **********************************

    
/// <summary>
    
/// 当前对象
    
/// </summary>
    private object objCurrentObject = null;

    
private bool bolIsEmpty = false;
    
/// <summary>
    
/// 该目录为空
    
/// </summary>
    public bool IsEmpty
    {
        
get { return bolIsEmpty; }
    }
    
private int intSearchedCount = 0;
    
/// <summary>
    
/// 已找到的对象的个数
    
/// </summary>
    public int SearchedCount
    {
        
get { return intSearchedCount; }
    }
    
private bool bolIsFile = true;
    
/// <summary>
    
/// 当前对象是否为文件,若为true则当前对象为文件,否则为目录
    
/// </summary>
    public bool IsFile
    {
        
get { return bolIsFile; }
    }
    
private int intLastErrorCode = 0;
    
/// <summary>
    
/// 最后一次操作的Win32错误代码
    
/// </summary>
    public int LastErrorCode
    {
        
get { return intLastErrorCode; }
    }
    
/// <summary>
    
/// 当前对象的名称
    
/// </summary>
    public string Name
    {
        
get
        {
            
if (this.objCurrentObject != null)
            {
                
if (objCurrentObject is string)
                    
return (string)this.objCurrentObject;
                
else
                    
return ((System.IO.FileSystemInfo)this.objCurrentObject).Name;
            }
            
return null;
        }
    }
    
/// <summary>
    
/// 当前对象属性
    
/// </summary>
    public System.IO.FileAttributes Attributes
    {
        
get { return (System.IO.FileAttributes)myData.dwFileAttributes; }
    }
    
/// <summary>
    
/// 当前对象创建时间
    
/// </summary>
    public System.DateTime CreationTime
    {
        
get
        {
            
long time = ToLong(myData.ftCreationTime_dwHighDateTime, myData.ftCreationTime_dwLowDateTime);
            System.DateTime dtm 
= System.DateTime.FromFileTimeUtc(time);
            
return dtm.ToLocalTime();
        }
    }
    
/// <summary>
    
/// 当前对象最后访问时间
    
/// </summary>
    public System.DateTime LastAccessTime
    {
        
get
        {
            
long time = ToLong(myData.ftLastAccessTime_dwHighDateTime, myData.ftLastAccessTime_dwLowDateTime);
            System.DateTime dtm 
= System.DateTime.FromFileTimeUtc(time);
            
return dtm.ToLocalTime();
        }
    }
    
/// <summary>
    
/// 当前对象最后保存时间
    
/// </summary>
    public System.DateTime LastWriteTime
    {
        
get
        {
            
long time = ToLong(myData.ftLastWriteTime_dwHighDateTime, myData.ftLastWriteTime_dwLowDateTime);
            System.DateTime dtm 
= System.DateTime.FromFileTimeUtc(time);
            
return dtm.ToLocalTime();
        }
    }
    
/// <summary>
    
/// 当前文件长度,若为当前对象为文件则返回文件长度,若当前对象为目录则返回0
    
/// </summary>
    public long FileLength
    {
        
get
        {
            
if (this.bolIsFile)
                
return ToLong(myData.nFileSizeHigh, myData.nFileSizeLow);
            
else
                
return 0;
        }
    }

    
#endregion

    
#region 控制对象特性的一些属性 ****************************************

    
private bool bolThrowIOException = true;
    
/// <summary>
    
/// 发生IO错误时是否抛出异常
    
/// </summary>
    public bool ThrowIOException
    {
        
get { return this.bolThrowIOException; }
        
set { this.bolThrowIOException = value; }
    }
    
private bool bolReturnStringType = true;
    
/// <summary>
    
/// 是否以字符串方式返回查询结果,若返回true则当前对象返回为字符串,
    
/// 否则返回 System.IO.FileInfo或System.IO.DirectoryInfo类型
    
/// </summary>
    public bool ReturnStringType
    {
        
get { return bolReturnStringType; }
        
set { bolReturnStringType = value; }
    }
    
    
private string strSearchPattern = "*";
    
/// <summary>
    
/// 要匹配的文件或目录名,支持通配符
    
/// </summary>
    public string SearchPattern
    {
        
get { return strSearchPattern; }
        
set { strSearchPattern = value; }
    }
    
private string strSearchPath = null;
    
/// <summary>
    
/// 搜索的父目录,必须为绝对路径,不得有通配符,该目录必须存在
    
/// </summary>
    public string SearchPath
    {
        
get { return strSearchPath; }
        
set { strSearchPath = value; }
    }

    
private bool bolSearchForFile = true;
    
/// <summary>
    
/// 是否查找文件
    
/// </summary>
    public bool SearchForFile
    {
        
get { return bolSearchForFile; }
        
set { bolSearchForFile = value; }
    }
    
private bool bolSearchForDirectory = true;
    
/// <summary>
    
/// 是否查找子目录
    
/// </summary>
    public bool SearchForDirectory
    {
        
get { return bolSearchForDirectory; }
        
set { bolSearchForDirectory = value; }
    }

    
#endregion

    
/// <summary>
    
/// 关闭对象,停止搜索
    
/// </summary>
    public void Close()
    {
        
this.CloseHandler();
    }

    
#region IEnumerator 成员 **********************************************

    
/// <summary>
    
/// 返回当前对象
    
/// </summary>
    public object Current
    {
        
get { return objCurrentObject ; }
    }
    
/// <summary>
    
/// 找到下一个文件或目录
    
/// </summary>
    
/// <returns>操作是否成功</returns>
    public bool MoveNext()
    {
        
bool success = false;
        
while (true)
        {
            
if (this.bolStartSearchFlag)
                success 
= this.SearchNext();
            
else
                success 
= this.StartSearch();
            
if (success)
            {
                
if (this.UpdateCurrentObject())
                    
return true;
            }
            
else
            {
                
this.objCurrentObject = null;
                
return false;
            }
        }
    }

    
/// <summary>
    
/// 重新设置对象
    
/// </summary>
    public void Reset()
    {
        
if (this.strSearchPath == null)
            
throw new System.ArgumentNullException("SearchPath can not null");
        
if (this.strSearchPattern == null || this.strSearchPattern.Length == 0)
            
this.strSearchPattern = "*";

        
this.intSearchedCount = 0;
        
this.objCurrentObject = null;
        
this.CloseHandler();
        
this.bolStartSearchFlag = false;
        
this.bolIsEmpty = false;
        
this.intLastErrorCode = 0;
    }

    
#endregion

    
#region 声明WIN32API函数以及结构 **************************************

    [Serializable,
    System.Runtime.InteropServices.StructLayout
        (System.Runtime.InteropServices.LayoutKind.Sequential,
        CharSet 
= System.Runtime.InteropServices.CharSet.Auto
        ),
    System.Runtime.InteropServices.BestFitMapping(
false)]
    
private struct WIN32_FIND_DATA
    {
        
public int dwFileAttributes;
        
public int ftCreationTime_dwLowDateTime;
        
public int ftCreationTime_dwHighDateTime;
        
public int ftLastAccessTime_dwLowDateTime;
        
public int ftLastAccessTime_dwHighDateTime;
        
public int ftLastWriteTime_dwLowDateTime;
        
public int ftLastWriteTime_dwHighDateTime;
        
public int nFileSizeHigh;
        
public int nFileSizeLow;
        
public int dwReserved0;
        
public int dwReserved1;
        [System.Runtime.InteropServices.MarshalAs
            (System.Runtime.InteropServices.UnmanagedType.ByValTStr,
            SizeConst 
= 260)]
        
public string cFileName;
        [System.Runtime.InteropServices.MarshalAs
            (System.Runtime.InteropServices.UnmanagedType.ByValTStr,
            SizeConst 
= 14)]
        
public string cAlternateFileName;
    }

    [System.Runtime.InteropServices.DllImport
        (
"kernel32.dll",
        CharSet 
= System.Runtime.InteropServices.CharSet.Auto,
        SetLastError 
= true)]
    
private static extern IntPtr FindFirstFile(string pFileName, ref WIN32_FIND_DATA pFindFileData);

    [System.Runtime.InteropServices.DllImport
        (
"kernel32.dll",
       CharSet 
= System.Runtime.InteropServices.CharSet.Auto,
        SetLastError 
= true)]
    
private static extern bool FindNextFile(IntPtr hndFindFile, ref WIN32_FIND_DATA lpFindFileData);

    [System.Runtime.InteropServices.DllImport(
"kernel32.dll", SetLastError = true)]
    
private static extern bool FindClose(IntPtr hndFindFile);

    
private static long ToLong( int height , int low)
    {
        
long v = ( uint ) height ;
        v 
= v << 0x20;
        v 
= v | ( ( uint )low );
        
return v;
    }

    
private static void WinIOError(int errorCode, string str)
    {
        
switch (errorCode)
        {
            
case 80:
                
throw new System.IO.IOException("IO_FileExists :" + str);
            
case 0x57:
                
throw new System.IO.IOException("IOError:" + MakeHRFromErrorCode(errorCode));
            
case 0xce:
                
throw new System.IO.PathTooLongException("PathTooLong:" + str );
            
case 2:
                
throw new System.IO.FileNotFoundException("FileNotFound:" + str);
            
case 3:
                
throw new System.IO.DirectoryNotFoundException("PathNotFound:" + str);
            
case 5:
                
throw new UnauthorizedAccessException("UnauthorizedAccess:" + str);
            
case 0x20:
                
throw new System.IO.IOException("IO_SharingViolation:" + str);
        }
        
throw new System.IO.IOException("IOError:" + MakeHRFromErrorCode(errorCode));
    }

    
private static int MakeHRFromErrorCode(int errorCode)
    {
        
return (-2147024896 | errorCode);
    }

    
#endregion

    
#region 内部代码群 ****************************************************

    
private static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
    
/// <summary>
    
/// 查找处理的底层句柄
    
/// </summary>
    private System.IntPtr intSearchHandler = INVALID_HANDLE_VALUE;

    
private WIN32_FIND_DATA myData = new WIN32_FIND_DATA();
    
/// <summary>
    
/// 开始搜索标志
    
/// </summary>
    private bool bolStartSearchFlag = false;
    
/// <summary>
    
/// 关闭内部句柄
    
/// </summary>
    private void CloseHandler()
    {
        
if (this.intSearchHandler != INVALID_HANDLE_VALUE)
        {
            FindClose(
this.intSearchHandler);
            
this.intSearchHandler = INVALID_HANDLE_VALUE;
        }
    }
    
/// <summary>
    
/// 开始搜索
    
/// </summary>
    
/// <returns>操作是否成功</returns>
    private bool StartSearch()
    {
        bolStartSearchFlag 
= true;
        bolIsEmpty 
= false;
        objCurrentObject 
= null;
        intLastErrorCode 
= 0;

        
string strPath = System.IO.Path.Combine(strSearchPath, this.strSearchPattern);
        
this.CloseHandler();
        intSearchHandler 
= FindFirstFile(strPath, ref myData);
        
if (intSearchHandler == INVALID_HANDLE_VALUE)
        {
            intLastErrorCode 
= System.Runtime.InteropServices.Marshal.GetLastWin32Error();
            
if (intLastErrorCode == 2)
            {
                bolIsEmpty 
= true;
                
return false;
            }
            
ifthis.bolThrowIOException )
                WinIOError( intLastErrorCode , strSearchPath);
            
else
                
return false;
        }
        
return true;
    }
    
/// <summary>
    
/// 搜索下一个
    
/// </summary>
    
/// <returns>操作是否成功</returns>
    private bool SearchNext()
    {
        
if (bolStartSearchFlag == false)
            
return false;
        
if (bolIsEmpty)
            
return false;
        
if (intSearchHandler == INVALID_HANDLE_VALUE)
            
return false;
        intLastErrorCode 
= 0 ;
        
if (FindNextFile(intSearchHandler, ref myData) == false)
        {
            intLastErrorCode 
= System.Runtime.InteropServices.Marshal.GetLastWin32Error();
            
this.CloseHandler();
            
if (intLastErrorCode != 0 && intLastErrorCode != 0x12)
            {
                
if (this.bolThrowIOException)
                    WinIOError(intLastErrorCode , strSearchPath);
                
else
                    
return false;
            }
            
return false;
        }
        
return true;
    }
//private bool SearchNext()

    
/// <summary>
    
/// 更新当前对象
    
/// </summary>
    
/// <returns>操作是否成功</returns>
    private bool UpdateCurrentObject()
    {
        
if (intSearchHandler == INVALID_HANDLE_VALUE)
            
return false;
        
bool Result = false;
        
this.objCurrentObject = null;
        
if ((myData.dwFileAttributes & 0x10== 0)
        {
            
// 当前对象为文件
            this.bolIsFile = true;
            
if (this.bolSearchForFile)
                Result 
= true;
        }
        
else 
        {
            
// 当前对象为目录
            this.bolIsFile = false;
            
if (this.bolSearchForDirectory)
            {
                
if (myData.cFileName == "." || myData.cFileName == "..")
                    Result 
= false;
                
else
                    Result 
= true;
            }
        }
        
if (Result)
        {
            
if (this.bolReturnStringType)
                
this.objCurrentObject = myData.cFileName;
            
else
            {
                
string p = System.IO.Path.Combine(this.strSearchPath, myData.cFileName);
                
if (this.bolIsFile)
                {
                    
this.objCurrentObject = new System.IO.FileInfo(p);
                }
                
else
                {
                    
this.objCurrentObject = new System.IO.DirectoryInfo(p);
                }
            }
            
this.intSearchedCount++;
        }
        
return Result;
    }
//private bool UpdateCurrentObject()

    
#endregion

}
//public class FileDirectoryEnumerator : System.Collections.IEnumerator

 

 

袁永福 ( http://www.xdesigner.cn )2007

posted on 2006-12-08 10:57 袁永福 阅读(4207) 评论(24)  编辑 收藏

评论

#1楼 2006-12-08 12:17 纶巾客      

不错,支持   回复  引用  查看    

#2楼 2006-12-08 12:31 木野狐      

收藏   回复  引用  查看    

#3楼 2006-12-08 12:35 随心所欲      

非常好。我正在想办法实现呢。多谢。
在一个目录里面如果出现几万个文件,c#的那个类的确会要了你得命的。
  回复  引用  查看    

#4楼 2006-12-08 14:42 肥仔鱼      

很好,方法可以借鉴到其他相似方面上   回复  引用  查看    

#5楼 2006-12-08 15:49 juqiang[未注册用户]

有测试数据吗?对于C#和api的对比   回复  引用    

#6楼 2006-12-08 17:11 Daniel Phang      

good!   回复  引用  查看    

#7楼 2006-12-09 10:12 Kevin Wu      

很好,刚好现在有个这样的应用要用到c++实现,多谢共享了   回复  引用  查看    

#8楼 2006-12-11 11:12 随心所欲      

@juqiang

无聊的人不少,这是我测试的代码

private string pattern = "*.*";
private void button1_Click(object sender, EventArgs e)
{
DateTime dt = DateTime.Now;
DirectoryInfo di = new DirectoryInfo(path);
FileInfo[] fis = di.GetFiles(pattern, SearchOption.TopDirectoryOnly);
string all = "";
for (int i = 0; i < fis.Length; i++)
{
all += fis[i].Name + "\n";
}
TimeSpan span = DateTime.Now - dt;
this.label1.Text = fis.Length.ToString() + ":" + (span.Seconds * 1000 + span.Milliseconds).ToString();
}

private void button2_Click(object sender, EventArgs e)
{
DateTime dt = DateTime.Now;
XFileSystem.FileDirectoryEnumerable win32 = new FileDirectoryEnumerable();
win32.SearchPath = path;
win32.ReturnStringType = true;
win32.SearchPattern = pattern;
win32.SearchDirectory = false;
win32.SearchFile = true;
string all = "";
int count = 0;

foreach (object name in win32)
{
all += name.ToString()+"\n";
count++;
}
TimeSpan span = DateTime.Now - dt;
this.label2.Text = count.ToString()+":"+(span.Seconds * 1000 + span.Milliseconds).ToString();
}

这是测试结果。文件数,和两个方法用的时间。
FileCount C# (ms) Win32(ms)
260 61 32
2412 250 203
3960 1671 1000
7290 8531 3734
15840 40812 19875

敢问,用这些代码不算侵权吧?
  回复  引用  查看    

#9楼[楼主] 2006-12-11 14:37 袁永福      

不错不错,支持。因为有时候只是判断是否有文件或子目录,用GetFiles或GetDirectories实在是太浪费了。若用FileDirectoryEnumerator类型则连循环都不要用而可以直接判断。   回复  引用  查看    

#10楼 2007-08-27 16:07 Kenny@Web      

不错,非常有帮助!   回复  引用  查看    

#11楼 2008-05-31 14:24 xrainfir      

SearchDirectory 这东西在哪里?
示例代码不能用怎么...
  回复  引用  查看    

#12楼 2008-08-04 15:43 hbfly      

e.SearchPath = @"c:\";
这样搜索根目录不会有权限问题吗?
我试了下string[] SearchFileList = Directory.GetFiles(@"c:\", "osql.exe", SearchOption.AllDirectories);也不是很慢呀,呵呵
  回复  引用  查看    

#13楼 2008-08-07 08:59 红尘中迷茫      

楼主,class Program
{
static void Main(string[] args)
{
FileDirectoryEnumerable e = new FileDirectoryEnumerable();
e.SearchPath = @"c:\";
e.ReturnStringType = true;
e.SearchPattern = "*.exe";
e.SearchForDirectory= true;
e.SearchForFile = true;
foreach (object name in e)
{
System.Console.WriteLine(name);
}
System.Console.ReadLine();
}
}

没有任何反应,何故?
  回复  引用  查看    

#14楼 2008-09-02 16:02 Jeri[未注册用户]

--引用--------------------------------------------------
红尘中迷茫: 楼主,class Program
{
static void Main(string[] args)
{
FileDirectoryEnumerable e = new FileDirectoryEnumerable();
e.SearchPath = @&quot;c:\&quot;;
e.ReturnStringType = true;
e.SearchPattern = &quot;*.exe&quot;;
e.SearchForDirectory= true;
e.SearchForFile = true;
foreach (object name in e)
{
System.Console.WriteLine(name);
}
System.Console.ReadLine();
}
}

没有任何反应,何故?
--------------------------------------------------------
我也问何故?
  回复  引用    

#15楼 2008-09-25 15:00 2.0初學者[未注册用户]

此代碼無法查詢子目錄中的文件呀.
--------------------
private bool bolSearchForDirectory = true;
/// <summary>
/// 是否查找子目录
/// </summary>
public bool SearchForDirectory
{
get { return bolSearchForDirectory; }
set { bolSearchForDirectory = value; }
}

------------------
無論true還是false, 這個不起作用!
  回复  引用    

#16楼 2008-11-08 16:42 怡人      

学习   回复  引用  查看    

#17楼 2008-12-31 12:28 mapk      

我的测试结果:
文件数 C# (ms) Win32(ms)
86680 2000 625
用c#方法占用内存52416K
win32 10872K
用43340个文件对比,发现c#方法随着文件数量的倍增,占用的内存也大幅增加。
有个问题不明白,MS为什么不提供类似的FindFirstFile,FindNextFile呢?
  回复  引用  查看    

#18楼 2009-01-06 23:59 Great08[未注册用户]

That's great Code! thanks   回复  引用    

#19楼 2009-03-02 18:30 农民伯伯      

用到 多谢 : )   回复  引用  查看    

#20楼 2009-03-10 18:20 sixue[未注册用户]

前面的注释有错误
/// e.SearchDirectory = false ;
/// e.SearchFile = true;
应该是
/// e.SearchForDirectory = false ;
/// e.SearchForFile = true;
  回复  引用    

#21楼 2009-03-10 18:36 sixue[未注册用户]


--引用--------------------------------------------------
红尘中迷茫: 楼主,class Program
{
static void Main(string[] args)
{
FileDirectoryEnumerable e = new FileDirectoryEnumerable();
e.SearchPath = @&quot;c:\&quot;;
e.ReturnStringType = true;
e.SearchPattern = &quot;*.exe&quot;;
e.SearchForDirectory= true;
e.SearchForFile = true;
foreach (object name in e)
{
System.Console.WriteLine(name);
}
System.Console.ReadLine();
}
}

没有任何反应,何故?
--------------------------------------------------------
因为你的C:\下没有任何.exe文件
  回复  引用    

#22楼 2009-03-10 18:37 sixue[未注册用户]

--引用--------------------------------------------------
2.0初學者: 此代碼無法查詢子目錄中的文件呀.
--------------------
private bool bolSearchForDirectory = true;
/// &lt;summary&gt;
/// 是否查找子目录
/// &lt;/summary&gt;
public bool SearchForDirectory
{
get { return bolSearchForDirectory; }
set { bolSearchForDirectory = value; }
}

------------------
無論true還是false, 這個不起作用!
--------------------------------------------------------
这个属性不是递归查找的意思,而是结果是否包含子目录的意思
  回复  引用    

#23楼 2009-03-10 18:38 sixue[未注册用户]

效果不错:)
我的目录里有67w个文件
用C#的GetFiles,卡在那里一个小时没动地方
用lz的方法,跑过去了...
  回复  引用    

#24楼 2009-03-10 18:50 sixue[未注册用户]

--引用--------------------------------------------------
sixue: 效果不错:)
我的目录里有67w个文件
用C#的GetFiles,卡在那里一个小时没动地方
用lz的方法,跑过去了...
--------------------------------------------------------
实际跑的结果,72w个文件,3~40分钟吧:)
  回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 586177




相关文章:

相关链接: