一個菜鳥寫的多線程刪除文件的代碼,大家給點意見
公司圖片服務器某個盤今天又滿了,每次都是用一個控制臺程序去刪文件,我DOS命令不熟,今天突發(fā)奇想用上多線程是不是會快一些呢?然后就寫了些代碼,本菜鳥接觸c#2年多工作1年多。代碼是一個小時寫完的,沒有任何優(yōu)化,只為實現功能,希望大家對于代碼給點意見,本以為用了多線程刪除的速度就會快上一點,但是與原來一個線程沒什么大的變化,是不是IO瓶頸了。
using System;
using System.Collections.Generic;
using System.IO;
using System.Collections;
namespace FiledbWrite
{
class Program
{
static void Main(string[] args)
{
DateTime timeStart = DateTime.Now;
string path = System.Configuration.ConfigurationManager.AppSettings["path"];
List<deletefile> allPath = new List<deletefile>();
int I = 0;
foreach (string file in Directory.GetDirectories(path))
{
deleteFile d = new deleteFile();
d.originalDir = file;
d.tempDir = file;
d.deleteAction = new System.Threading.Thread(d.Action);
d.threadNO = I;
allPath.Add(d);
I++;
}
foreach (deleteFile d in allPath)
{
try
{
d.deleteAction.Start();
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
}
while (true)
{
if (getState(allPath))
break;
}
DateTime timeEnd = DateTime.Now;
TimeSpan timeSpan = timeEnd - timeStart;
Console.WriteLine(string.Format("線程數:{0},總用時{1}s", I + 1, timeSpan.Seconds));
Console.ReadLine();
}
//獲取當前所有線程狀態(tài)是否都已停止(刪除完)
public static bool getState(List<deletefile> d)
{
bool over = true;
foreach (deleteFile ddd in d)
{
if (ddd.deleteAction.IsAlive)
return false;
}
return over;
}
}
//文件刪除功能類 作者頭腦簡單圖省事 使用多個類實現了多線程
public class deleteFile
{
//線程編號
public int threadNO = 0;
public System.Threading.Thread deleteAction;
/// <summary>
/// 臨時目錄
/// </summary>
public string tempDir = string.Empty;
/// <summary>
/// 原始目錄
/// </summary>
public string originalDir = string.Empty;
public void Action()
{
try
{
//刪除每個文件夾下文件
DeleteFolderFile();
//刪除文件夾
Directory.Delete(originalDir, true);
//停止線程
deleteAction.Abort();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
public void DeleteFolderFile()
{
try
{
System.IO.File.SetAttributes(tempDir, System.IO.FileAttributes.Normal);
foreach (string d in Directory.GetFileSystemEntries(tempDir))
{
System.IO.File.SetAttributes(d, System.IO.FileAttributes.Normal);
if (File.Exists(d))
{
FileInfo fi = new FileInfo(d);
if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1)//避免只讀文件
{ fi.Attributes = FileAttributes.Normal; }
Console.WriteLine(string.Format("當前文件:{0},當前線程:{1}", d, threadNO));
File.Delete(d); //刪除文件
}
else
{
try
{
tempDir = d;
DeleteFolderFile();//遞歸
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
using System.Collections.Generic;
using System.IO;
using System.Collections;
namespace FiledbWrite
{
class Program
{
static void Main(string[] args)
{
DateTime timeStart = DateTime.Now;
string path = System.Configuration.ConfigurationManager.AppSettings["path"];
List<deletefile> allPath = new List<deletefile>();
int I = 0;
foreach (string file in Directory.GetDirectories(path))
{
deleteFile d = new deleteFile();
d.originalDir = file;
d.tempDir = file;
d.deleteAction = new System.Threading.Thread(d.Action);
d.threadNO = I;
allPath.Add(d);
I++;
}
foreach (deleteFile d in allPath)
{
try
{
d.deleteAction.Start();
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
}
while (true)
{
if (getState(allPath))
break;
}
DateTime timeEnd = DateTime.Now;
TimeSpan timeSpan = timeEnd - timeStart;
Console.WriteLine(string.Format("線程數:{0},總用時{1}s", I + 1, timeSpan.Seconds));
Console.ReadLine();
}
//獲取當前所有線程狀態(tài)是否都已停止(刪除完)
public static bool getState(List<deletefile> d)
{
bool over = true;
foreach (deleteFile ddd in d)
{
if (ddd.deleteAction.IsAlive)
return false;
}
return over;
}
}
//文件刪除功能類 作者頭腦簡單圖省事 使用多個類實現了多線程
public class deleteFile
{
//線程編號
public int threadNO = 0;
public System.Threading.Thread deleteAction;
/// <summary>
/// 臨時目錄
/// </summary>
public string tempDir = string.Empty;
/// <summary>
/// 原始目錄
/// </summary>
public string originalDir = string.Empty;
public void Action()
{
try
{
//刪除每個文件夾下文件
DeleteFolderFile();
//刪除文件夾
Directory.Delete(originalDir, true);
//停止線程
deleteAction.Abort();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
public void DeleteFolderFile()
{
try
{
System.IO.File.SetAttributes(tempDir, System.IO.FileAttributes.Normal);
foreach (string d in Directory.GetFileSystemEntries(tempDir))
{
System.IO.File.SetAttributes(d, System.IO.FileAttributes.Normal);
if (File.Exists(d))
{
FileInfo fi = new FileInfo(d);
if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1)//避免只讀文件
{ fi.Attributes = FileAttributes.Normal; }
Console.WriteLine(string.Format("當前文件:{0},當前線程:{1}", d, threadNO));
File.Delete(d); //刪除文件
}
else
{
try
{
tempDir = d;
DeleteFolderFile();//遞歸
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
看了大家的評論我想說幾句,關于操作系統(tǒng)的東西不是很了解,希望大家可以不吝賜教,貼出這段代碼的主要想法是想讓大家看一下代碼在邏輯上,線程的使用上,語法上,有沒有什么讓人看起來不舒服的地方,或者是不是能用到一些設計模式來“美化”以下代碼。

浙公網安備 33010602011771號