问题
I wrote a test program to monitor my Picture folder which points to c:\users[username]\Pictures and temporary internet files folder for the same user. This is program works perfectly fine if I change the folder to other location like d:\persona_pics. Any idea why events are not being raised when I set the mentioned folder to monitor?
here is the code.
class Program
{
static void Main(string[] args)
{
//FileSystemWatcher myJpegFileWatcher = new FileSystemWatcher(@"C:\Users\[username]\AppData\Local\Microsoft\Windows\Temporary Internet Files\low\content.ie5\");
FileSystemWatcher myJpegFileWatcher = new FileSystemWatcher(@"C:\Users\[username]\Pictures\ ");
myJpegFileWatcher.Filter = "*.jpg";
myJpegFileWatcher.Created += new FileSystemEventHandler(myJpegFileWatcher_Created);
myJpegFileWatcher.Changed += new FileSystemEventHandler(myJpegFileWatcher_Changed);
myJpegFileWatcher.IncludeSubdirectories = true;
myJpegFileWatcher.NotifyFilter = NotifyFilters.CreationTime;
myJpegFileWatcher.EnableRaisingEvents = true;
Console.Read();
}
static void myJpegFileWatcher_Changed(object sender, FileSystemEventArgs e)
{
FileInfo duplicateFile = new FileInfo(@e.FullPath);
bool flag = true;
while (flag)
{
try
{
if (duplicateFile.Length > 20000)
{
duplicateFile.CopyTo(@"d:\pics\spy\ " + e.Name);
flag = false;
StreamWriter fs = new StreamWriter(@"d:\pics\log.txt", true);
fs.WriteLine("file is being copied:{0}, Size={1}", e.FullPath, duplicateFile.Length);
fs.Close();
}
else
{
StreamWriter fs = new StreamWriter(@"d:\pics\log.txt", true);
fs.WriteLine("file is not being copied:{0}, Size={1}", e.FullPath, duplicateFile.Length);
fs.Close();
}
}
catch (Exception ex)
{
//
}
}
}
static void myJpegFileWatcher_Created(object sender, FileSystemEventArgs e)
{
FileInfo duplicateFile = new FileInfo(@e.FullPath);
bool flag = true;
while (flag)
{
try
{
if (duplicateFile.Length > 20000)
{
duplicateFile.CopyTo(@"d:\pics\spy\ " + e.Name);
flag = false;
StreamWriter fs = new StreamWriter(@"d:\pics\log.txt", true);
fs.WriteLine("file is being copied:{0}, Size={1}", e.FullPath, duplicateFile.Length);
fs.Close();
}
}
catch (Exception ex)
{
//
}
}
}
}
Working code..
class Program { static void Main(string[] args) {
FileSystemWatcher myJpegFileWatcher = new FileSystemWatcher(@"C:\Users\[user]\Pictures\");
myJpegFileWatcher.Filter = "*.jpg";
myJpegFileWatcher.Changed += new FileSystemEventHandler(myJpegFileWatcher_Changed);
myJpegFileWatcher.IncludeSubdirectories = true;
myJpegFileWatcher.EnableRaisingEvents = true;
Console.Read();
}
static void myJpegFileWatcher_Changed(object sender, FileSystemEventArgs e)
{
FileInfo duplicateFile = new FileInfo(@e.FullPath);
bool flag = true;
while (flag)
{
try
{
if (duplicateFile.Exists)
{
if (duplicateFile.Length > 20000)
{
try
{
duplicateFile.CopyTo(@"d:\pics\spy\" + e.Name,true);
}
catch (Exception ex)
{
StreamWriter fs = new StreamWriter(@"d:\pics\log.txt", true);
fs.WriteLine("Error Inside copying:{0}", ex.Message);
fs.Close();
}
finally
{
flag = false;
StreamWriter fs = new StreamWriter(@"d:\pics\log.txt", true);
fs.WriteLine("file is being copied:{0}, Size={1}", e.FullPath, duplicateFile.Length);
fs.Close();
}
}
else
{
StreamWriter fs = new StreamWriter(@"d:\pics\log.txt", true);
fs.WriteLine("file is not being copied:{0}, Size={1}", e.FullPath, duplicateFile.Length);
fs.Close();
}
}
}
catch (Exception ex)
{
StreamWriter fs = new StreamWriter(@"d:\pics\log.txt", true);
fs.WriteLine("Error:{0}", ex.Message);
fs.Close();
}
}
}
}
回答1:
Try to run FileMon (SysInternals tool available through MSDN). It will show you what your code actually does on the file system. Then you might be able to find out why or what exactly behaves differently when you point your code to "My Pictures" etc.
来源:https://stackoverflow.com/questions/1351691/filesystemwatcher-not-monitoring-local-user-folder-or-temporary-internet-files-f