1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-18 16:10:26 +02:00
Beef/BeefLibs/corlib/src/IO/FileSystemWatcher.bf

93 lines
2.4 KiB
Beef
Raw Normal View History

2019-08-23 11:56:54 -07:00
using System.Diagnostics;
using System.Threading;
namespace System.IO
{
public class FileSystemWatcher
{
String mDirectory ~ delete _;
String mFilter ~ delete _;
Platform.BfpFileWatcher* mFileWatcher;
public delegate void CreatedFunc(String fileName);
public delegate void DeletedFunc(String fileName);
public delegate void ChangedFunc(String fileName);
public delegate void RenameFunc(String newName, String oldName);
public delegate void ErrorFunc();
public Event<ChangedFunc> OnChanged ~ _.Dispose();
public Event<CreatedFunc> OnCreated ~ _.Dispose();
public Event<DeletedFunc> OnDeleted ~ _.Dispose();
public Event<RenameFunc> OnRenamed ~ _.Dispose();
public Event<ErrorFunc> OnError ~ _.Dispose();
public bool IncludeSubdirectories;
public this()
{
mDirectory = String.Empty;
mFilter = "*.*";
}
public this(StringView path) : this(path, "*.*")
{
}
public this(StringView path, StringView filter)
{
this.mDirectory = new String(path);
this.mFilter = new String(filter);
}
public ~this()
{
StopRaisingEvents().IgnoreError();
}
public String Directory
{
get
{
return mDirectory;
}
}
static void BfpDirectoryChangeFunc(Platform.BfpFileWatcher* watcher, void* userData, Platform.BfpFileChangeKind changeKind, char8* directory, char8* fileName, char8* newName)
{
let fileSysWatcher = (FileSystemWatcher)Internal.UnsafeCastToObject(userData);
switch (changeKind)
{
case .BfpFileChangeKind_Added:
fileSysWatcher.OnCreated(scope String(fileName));
case .BfpFileChangeKind_Modified:
fileSysWatcher.OnChanged(scope String(fileName));
case .BfpFileChangeKind_Removed:
fileSysWatcher.OnDeleted(scope String(fileName));
case .BfpFileChangeKind_Renamed:
fileSysWatcher.OnRenamed(scope String(fileName), scope String(newName));
case .BfpFileChangeKind_Failed:
fileSysWatcher.OnError();
}
}
public Result<void> StartRaisingEvents()
{
Platform.BfpFileWatcherFlags flags = IncludeSubdirectories ? .IncludeSubdirectories : .None;
mFileWatcher = Platform.BfpFileWatcher_WatchDirectory(mDirectory, => BfpDirectoryChangeFunc, flags, Internal.UnsafeCastToPtr(this), null);
if (mFileWatcher == null)
return .Err;
return .Ok;
}
public Result<void> StopRaisingEvents()
{
if (mFileWatcher == null)
return .Ok;
Platform.BfpFileWatcher_Release(mFileWatcher);
mFileWatcher = null;
return .Ok;
}
}
}