FileSystemWatcher onCreated tell where it was created from?

  • Thread starter Thread starter Guest
  • Start date Start date
G

Guest

I'm trying to get a piece of software that will monitor a location on a
drive, and if something appears on the location, report what was created and,
if applicable where it was copied from.
For instance, monitor my D:\
I copy a file from C:\ to D:\
I get "<filename> created on D:\ from C:\<filename>"

While I realize this may not be directly possible w/ .NET, if it's not, does
somebody know where I could look in the WinAPI to find this out?

Thanks
 
Hello Brandon,

The FileSystemWatcherClass is responsible for this

see sample below (MSDN).
The component is set to watch for changes in LastWrite and LastAccess time,
the creation, deletion, or renaming of text files in the directory. If a
file is changed, created, or deleted, the path to the file prints to the
console. When a file is renamed, the old and new paths print to the console.


public class Watcher
{

public static void Main()
{
Run();

}

[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
public static void Run()
{
string[] args = System.Environment.GetCommandLineArgs();

// If a directory is not specified, exit program.
if(args.Length != 2)
{
// Display the proper way to call the program.
Console.WriteLine("Usage: Watcher.exe (directory)");
return;
}

// Create a new FileSystemWatcher and set its properties.
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = args[1];
/* Watch for changes in LastAccess and LastWrite times, and
the renaming of files or directories. */
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite

| NotifyFilters.FileName | NotifyFilters.DirectoryName;
// Only watch text files.
watcher.Filter = "*.txt";

// Add event handlers.
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);

// Begin watching.
watcher.EnableRaisingEvents = true;

// Wait for the user to quit the program.
Console.WriteLine("Press \'q\' to quit the sample.");
while(Console.Read()!='q');
}

// Define the event handlers.
private static void OnChanged(object source, FileSystemEventArgs e)
{
// Specify what is done when a file is changed, created, or deleted.
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
}

private static void OnRenamed(object source, RenamedEventArgs e)
{
// Specify what is done when a file is renamed.
Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
}
}

B> I'm trying to get a piece of software that will monitor a location on
B> a
B> drive, and if something appears on the location, report what was
B> created and,
B> if applicable where it was copied from.
B> For instance, monitor my D:\
B> I copy a file from C:\ to D:\
B> I get "<filename> created on D:\ from C:\<filename>"
B> While I realize this may not be directly possible w/ .NET, if it's
B> not, does somebody know where I could look in the WinAPI to find this
B> out?
B>
B> Thanks
B>
---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour

"At times one remains faithful to a cause only because its opponents do not
cease to be insipid." (c) Friedrich Nietzsche
 
Your example does not cover the scenario I outlined.
--
He who dies with the most toys wins.


Michael Nemtsev said:
Hello Brandon,

The FileSystemWatcherClass is responsible for this

see sample below (MSDN).
The component is set to watch for changes in LastWrite and LastAccess time,
the creation, deletion, or renaming of text files in the directory. If a
file is changed, created, or deleted, the path to the file prints to the
console. When a file is renamed, the old and new paths print to the console.


public class Watcher
{

public static void Main()
{
Run();

}

[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
public static void Run()
{
string[] args = System.Environment.GetCommandLineArgs();

// If a directory is not specified, exit program.
if(args.Length != 2)
{
// Display the proper way to call the program.
Console.WriteLine("Usage: Watcher.exe (directory)");
return;
}

// Create a new FileSystemWatcher and set its properties.
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = args[1];
/* Watch for changes in LastAccess and LastWrite times, and
the renaming of files or directories. */
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite

| NotifyFilters.FileName | NotifyFilters.DirectoryName;
// Only watch text files.
watcher.Filter = "*.txt";

// Add event handlers.
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);

// Begin watching.
watcher.EnableRaisingEvents = true;

// Wait for the user to quit the program.
Console.WriteLine("Press \'q\' to quit the sample.");
while(Console.Read()!='q');
}

// Define the event handlers.
private static void OnChanged(object source, FileSystemEventArgs e)
{
// Specify what is done when a file is changed, created, or deleted.
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
}

private static void OnRenamed(object source, RenamedEventArgs e)
{
// Specify what is done when a file is renamed.
Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
}
}

B> I'm trying to get a piece of software that will monitor a location on
B> a
B> drive, and if something appears on the location, report what was
B> created and,
B> if applicable where it was copied from.
B> For instance, monitor my D:\
B> I copy a file from C:\ to D:\
B> I get "<filename> created on D:\ from C:\<filename>"
B> While I realize this may not be directly possible w/ .NET, if it's
B> not, does somebody know where I could look in the WinAPI to find this
B> out?
B>
B> Thanks
B>
---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour

"At times one remains faithful to a cause only because its opponents do not
cease to be insipid." (c) Friedrich Nietzsche
 
Hello Brandon,

sure, it's just a sample. Change in to meet your needs

B> Your example does not cover the scenario I outlined.
B>
B> "Michael Nemtsev" wrote:
B>
Hello Brandon,

The FileSystemWatcherClass is responsible for this

see sample below (MSDN).
The component is set to watch for changes in LastWrite and LastAccess
time,
the creation, deletion, or renaming of text files in the directory.
If a
file is changed, created, or deleted, the path to the file prints to
the
console. When a file is renamed, the old and new paths print to the
console.
public class Watcher
{
public static void Main()
{
Run();
}

[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
public static void Run()
{
string[] args = System.Environment.GetCommandLineArgs();
// If a directory is not specified, exit program.
if(args.Length != 2)
{
// Display the proper way to call the program.
Console.WriteLine("Usage: Watcher.exe (directory)");
return;
}
// Create a new FileSystemWatcher and set its properties.
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = args[1];
/* Watch for changes in LastAccess and LastWrite times, and
the renaming of files or directories. */
watcher.NotifyFilter = NotifyFilters.LastAccess |
NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
// Only watch text files.
watcher.Filter = "*.txt";
// Add event handlers.
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
// Begin watching.
watcher.EnableRaisingEvents = true;
// Wait for the user to quit the program.
Console.WriteLine("Press \'q\' to quit the sample.");
while(Console.Read()!='q');
}
// Define the event handlers.
private static void OnChanged(object source, FileSystemEventArgs e)
{
// Specify what is done when a file is changed, created, or deleted.
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
}
private static void OnRenamed(object source, RenamedEventArgs e)
{
// Specify what is done when a file is renamed.
Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath,
e.FullPath);
}
}
B> I'm trying to get a piece of software that will monitor a location
on
B> a
B> drive, and if something appears on the location, report what was
B> created and,
B> if applicable where it was copied from.
B> For instance, monitor my D:\
B> I copy a file from C:\ to D:\
B> I get "<filename> created on D:\ from C:\<filename>"
B> While I realize this may not be directly possible w/ .NET, if it's
B> not, does somebody know where I could look in the WinAPI to find
this
B> out?
B>
B> Thanks
B>
---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour
"At times one remains faithful to a cause only because its opponents
do not cease to be insipid." (c) Friedrich Nietzsche
---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour

"At times one remains faithful to a cause only because its opponents do not
cease to be insipid." (c) Friedrich Nietzsche
 
No.

What yours does is tells me when a file was created, changed, deleted, or
renamed - which is simple and something I've already done.

What I want is for when a file is CREATED, to be able to know where it was
created FROM (ie: if a file is copied, what was the source directory, if it
was saved from an application, a 'null' value is acceptable) this the
FileSystemWatcher does not do (straightforwardly anyway).
--
He who dies with the most toys wins.


Michael Nemtsev said:
Hello Brandon,

sure, it's just a sample. Change in to meet your needs

B> Your example does not cover the scenario I outlined.
B>
B> "Michael Nemtsev" wrote:
B>
Hello Brandon,

The FileSystemWatcherClass is responsible for this

see sample below (MSDN).
The component is set to watch for changes in LastWrite and LastAccess
time,
the creation, deletion, or renaming of text files in the directory.
If a
file is changed, created, or deleted, the path to the file prints to
the
console. When a file is renamed, the old and new paths print to the
console.
public class Watcher
{
public static void Main()
{
Run();
}

[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
public static void Run()
{
string[] args = System.Environment.GetCommandLineArgs();
// If a directory is not specified, exit program.
if(args.Length != 2)
{
// Display the proper way to call the program.
Console.WriteLine("Usage: Watcher.exe (directory)");
return;
}
// Create a new FileSystemWatcher and set its properties.
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = args[1];
/* Watch for changes in LastAccess and LastWrite times, and
the renaming of files or directories. */
watcher.NotifyFilter = NotifyFilters.LastAccess |
NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
// Only watch text files.
watcher.Filter = "*.txt";
// Add event handlers.
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
// Begin watching.
watcher.EnableRaisingEvents = true;
// Wait for the user to quit the program.
Console.WriteLine("Press \'q\' to quit the sample.");
while(Console.Read()!='q');
}
// Define the event handlers.
private static void OnChanged(object source, FileSystemEventArgs e)
{
// Specify what is done when a file is changed, created, or deleted.
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
}
private static void OnRenamed(object source, RenamedEventArgs e)
{
// Specify what is done when a file is renamed.
Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath,
e.FullPath);
}
}
B> I'm trying to get a piece of software that will monitor a location
on
B> a
B> drive, and if something appears on the location, report what was
B> created and,
B> if applicable where it was copied from.
B> For instance, monitor my D:\
B> I copy a file from C:\ to D:\
B> I get "<filename> created on D:\ from C:\<filename>"
B> While I realize this may not be directly possible w/ .NET, if it's
B> not, does somebody know where I could look in the WinAPI to find
this
B> out?
B>
B> Thanks
B>
---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour
"At times one remains faithful to a cause only because its opponents
do not cease to be insipid." (c) Friedrich Nietzsche
---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour

"At times one remains faithful to a cause only because its opponents do not
cease to be insipid." (c) Friedrich Nietzsche
 
Hello Brandon,

There are no functions to do that. What do u need is to monitor harddrivers
for changes,
and for each change, for example if file was created, u need to look at log
of changes of others drivers to
determine where file was to understand either it was newly created or copied.

B> What yours does is tells me when a file was created, changed,
B> deleted, or renamed - which is simple and something I've already
B> done.
B>
B> What I want is for when a file is CREATED, to be able to know where
B> it was created FROM (ie: if a file is copied, what was the source
B> directory, if it was saved from an application, a 'null' value is
B> acceptable) this the FileSystemWatcher does not do (straightforwardly
B> anyway).
B>
B> "Michael Nemtsev" wrote:
B>
Hello Brandon,

sure, it's just a sample. Change in to meet your needs

B> Your example does not cover the scenario I outlined.
B>
B> "Michael Nemtsev" wrote:
B>
Hello Brandon,

The FileSystemWatcherClass is responsible for this

see sample below (MSDN).
The component is set to watch for changes in LastWrite and
LastAccess
time,
the creation, deletion, or renaming of text files in the directory.
If a
file is changed, created, or deleted, the path to the file prints
to
the
console. When a file is renamed, the old and new paths print to the
console.
public class Watcher
{
public static void Main()
{
Run();
}
[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
public static void Run()
{
string[] args = System.Environment.GetCommandLineArgs();
// If a directory is not specified, exit program.
if(args.Length != 2)
{
// Display the proper way to call the program.
Console.WriteLine("Usage: Watcher.exe (directory)");
return;
}
// Create a new FileSystemWatcher and set its properties.
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = args[1];
/* Watch for changes in LastAccess and LastWrite times, and
the renaming of files or directories. */
watcher.NotifyFilter = NotifyFilters.LastAccess |
NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
// Only watch text files.
watcher.Filter = "*.txt";
// Add event handlers.
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
// Begin watching.
watcher.EnableRaisingEvents = true;
// Wait for the user to quit the program.
Console.WriteLine("Press \'q\' to quit the sample.");
while(Console.Read()!='q');
}
// Define the event handlers.
private static void OnChanged(object source, FileSystemEventArgs e)
{
// Specify what is done when a file is changed, created, or
deleted.
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
}
private static void OnRenamed(object source, RenamedEventArgs e)
{
// Specify what is done when a file is renamed.
Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath,
e.FullPath);
}
}
B> I'm trying to get a piece of software that will monitor a
location
on
B> a
B> drive, and if something appears on the location, report what was
B> created and,
B> if applicable where it was copied from.
B> For instance, monitor my D:\
B> I copy a file from C:\ to D:\
B> I get "<filename> created on D:\ from C:\<filename>"
B> While I realize this may not be directly possible w/ .NET, if
it's
B> not, does somebody know where I could look in the WinAPI to find
this
B> out?
B>
B> Thanks
B>
---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour
"At times one remains faithful to a cause only because its
opponents
do not cease to be insipid." (c) Friedrich Nietzsche
---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour
"At times one remains faithful to a cause only because its opponents
do not cease to be insipid." (c) Friedrich Nietzsche
---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour

"At times one remains faithful to a cause only because its opponents do not
cease to be insipid." (c) Friedrich Nietzsche
 
Creating an FSW on all the drives will also not help me - when a file is
copied FROM a drive, nothing about the file changes, therefore an FSW on the
drive will catch nothing. While LastAccess filter seems to grab the data
occasionally, it's not reliable in the least.

I was expecting a solution involving something with the WinAPI - can anybody
else offer some insight. I could have guaranteed that .NET wouldn't offer
this level of functionality.
--
He who dies with the most toys wins.


Michael Nemtsev said:
Hello Brandon,

There are no functions to do that. What do u need is to monitor harddrivers
for changes,
and for each change, for example if file was created, u need to look at log
of changes of others drivers to
determine where file was to understand either it was newly created or copied.

B> What yours does is tells me when a file was created, changed,
B> deleted, or renamed - which is simple and something I've already
B> done.
B>
B> What I want is for when a file is CREATED, to be able to know where
B> it was created FROM (ie: if a file is copied, what was the source
B> directory, if it was saved from an application, a 'null' value is
B> acceptable) this the FileSystemWatcher does not do (straightforwardly
B> anyway).
B>
B> "Michael Nemtsev" wrote:
B>
Hello Brandon,

sure, it's just a sample. Change in to meet your needs

B> Your example does not cover the scenario I outlined.
B>
B> "Michael Nemtsev" wrote:
B>
Hello Brandon,

The FileSystemWatcherClass is responsible for this

see sample below (MSDN).
The component is set to watch for changes in LastWrite and
LastAccess
time,
the creation, deletion, or renaming of text files in the directory.
If a
file is changed, created, or deleted, the path to the file prints
to
the
console. When a file is renamed, the old and new paths print to the
console.
public class Watcher
{
public static void Main()
{
Run();
}
[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
public static void Run()
{
string[] args = System.Environment.GetCommandLineArgs();
// If a directory is not specified, exit program.
if(args.Length != 2)
{
// Display the proper way to call the program.
Console.WriteLine("Usage: Watcher.exe (directory)");
return;
}
// Create a new FileSystemWatcher and set its properties.
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = args[1];
/* Watch for changes in LastAccess and LastWrite times, and
the renaming of files or directories. */
watcher.NotifyFilter = NotifyFilters.LastAccess |
NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
// Only watch text files.
watcher.Filter = "*.txt";
// Add event handlers.
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
// Begin watching.
watcher.EnableRaisingEvents = true;
// Wait for the user to quit the program.
Console.WriteLine("Press \'q\' to quit the sample.");
while(Console.Read()!='q');
}
// Define the event handlers.
private static void OnChanged(object source, FileSystemEventArgs e)
{
// Specify what is done when a file is changed, created, or
deleted.
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
}
private static void OnRenamed(object source, RenamedEventArgs e)
{
// Specify what is done when a file is renamed.
Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath,
e.FullPath);
}
}
B> I'm trying to get a piece of software that will monitor a
location
on
B> a
B> drive, and if something appears on the location, report what was
B> created and,
B> if applicable where it was copied from.
B> For instance, monitor my D:\
B> I copy a file from C:\ to D:\
B> I get "<filename> created on D:\ from C:\<filename>"
B> While I realize this may not be directly possible w/ .NET, if
it's
B> not, does somebody know where I could look in the WinAPI to find
this
B> out?
B>
B> Thanks
B>
---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour
"At times one remains faithful to a cause only because its
opponents
do not cease to be insipid." (c) Friedrich Nietzsche
---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour
"At times one remains faithful to a cause only because its opponents
do not cease to be insipid." (c) Friedrich Nietzsche
---
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour

"At times one remains faithful to a cause only because its opponents do not
cease to be insipid." (c) Friedrich Nietzsche
 
Brandon said:
I'm trying to get a piece of software that will monitor a location on a
drive, and if something appears on the location, report what was created
and,
if applicable where it was copied from.
For instance, monitor my D:\
I copy a file from C:\ to D:\
I get "<filename> created on D:\ from C:\<filename>"

While I realize this may not be directly possible w/ .NET, if it's not,
does
somebody know where I could look in the WinAPI to find this out?
....

I don't believe you will find something like that. Generally, there is no
way to get that info (even kernel usually does not know).

Goran
 
Back
Top