嗨我正在創建一個Windows服務來觀察某些目錄,看看目錄的大小是否達到其限制。 我創建了一個檔案系統觀察家如下FileSystemWatcher來監視目錄大小
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = dirPaths[i].ToString();
watcher.NotifyFilter = NotifyFilters.Size;
watcher.EnableRaisingEvents = true;
watcher.Changed += new FileSystemEventHandler(OnChanged);
和
private void OnChanged(object source, FileSystemEventArgs e)
{
try
{
string directory = new DirectoryInfo(e.FullPath).Parent.FullName;//gettting the directory path from the full path
float dirSize = CalculateFolderSize(directory);
float limitSize = int.Parse(_config.TargetSize);//getting the limit size
if (dirSize > limitSize)
{
eventLogCheck.WriteEntry("the folloing path has crossed the limit " + directory);
//TODO: mail sending
}
}
catch (Exception ex)
{
eventLogCheck.WriteEntry(ex.ToString());
}
}
CalculateFolderSize檢查在驅動器中的所有文件和子目錄的大小。
現在,當我將文件添加到目錄EQ一個的.xls和.txt等文件,但如果我將文件夾添加到目錄它不會觸發給onChanged事件能正常工作?
如果我啓用
watcher.IncludeSubdirectories = true;
它並觸發給onChanged事件,但在這種情況下,只檢查子目錄,而不是整個目錄。
請有人可以告訴我怎樣才能得到這個工作,這樣當我的文件夾複製到該目錄正在看着它觸發給onChanged事件並計算目錄
我CalculateFolderSize功能爲一體的新的大小如下如果這有助於
//function to calculate the size of the given path
private float CalculateFolderSize(string folder)
{
float folderSize = 0.0f;
try
{
//Checks if the path is valid or not
if (!Directory.Exists(folder))
{
return folderSize;
}
else
{
try
{
foreach (string file in Directory.GetFiles(folder))
{
if (File.Exists(file))
{
FileInfo finfo = new FileInfo(file);
folderSize += finfo.Length;
}
}
foreach (string dir in Directory.GetDirectories(folder))
{
folderSize += CalculateFolderSize(dir);
}
}
catch (NotSupportedException ex)
{
eventLogCheck.WriteEntry(ex.ToString());
}
}
}
catch (UnauthorizedAccessException ex)
{
eventLogCheck.WriteEntry(ex.ToString());
}
return folderSize;
}
這似乎是一個很好的解決方案和IM確保它的工作原理,但我是新來的VS C#,所以當我把watcher.Changed + =(發件人,E)=>它說,它是一個無效的表達式項幫助請問 – mayukh 2012-04-27 09:13:17
我也放了一個;在lambda表達式的末尾,但它不起作用 – mayukh 2012-04-27 09:25:27
您使用的是什麼版本的C#?您需要3.0版或更高版本才能使用lambda表達式。 – 2012-04-27 09:26:12