private class CloseNotifyingFileStream : System.IO.FileStream
{
/// <summary>
/// Raised before the stream is disposed.
/// </summary>
public EventHandler<EventArgs> Closing;
/// <summary>
/// Raised after the stream is closed.
/// </summary>
public EventHandler<EventArgs> Closed;
public CloseNotifyingFileStream(string path, FileMode mode, FileAccess access, FileShare share) : base(path, mode, access, share)
{
}
protected override void Dispose(bool disposing)
{
try
{
var closing = Closing;
if (closing != null) closing(this, EventArgs.Empty);
}
finally
{
base.Dispose(disposing);
}
var closed = Closed;
if (closed != null) closed(this, EventArgs.Empty);
}
}
provider.GetFileSystemNotifier().GetContentSurrogate += (s, e) =>
{
if ((e.ContentParameters.AccessType.HasFlag(NodeContentAccess.Write)) && (e.Node.Exists()))
{
e.Node.Context = @"E:\Testdaten\TEMP\" + System.Guid.NewGuid().ToString("N");
var vStream = new CloseNotifyingFileStream(e.Node.Context as string, System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite, System.IO.FileShare.None);
var content = NodeContent.CreateDelayedWriteContent(vStream);
vStream.Closing += (_, __) =>
{
Console.WriteLine("Closing {0} (length={1}).", vStream.Name, vStream.Length);
// inform original node about the change => invokes the SetContentSurrogate event
e.Node.SetContent(content);
};
vStream.Closed += (_, __) =>
{
Console.WriteLine("Closed {0}.", vStream.Name);
// we don't need the file anymore
File.Delete(vStream.Name);
};
e.ResultContent = content;
e.MarkAsHandled();
}
};