Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么FileSystemWatcher不';t在Linux容器中工作,监视Windows卷_C#_Linux_Docker_.net Core_Filesystemwatcher - Fatal编程技术网

C# 为什么FileSystemWatcher不';t在Linux容器中工作,监视Windows卷

C# 为什么FileSystemWatcher不';t在Linux容器中工作,监视Windows卷,c#,linux,docker,.net-core,filesystemwatcher,C#,Linux,Docker,.net Core,Filesystemwatcher,鉴于该计划: 使用系统; 使用System.IO; 名称空间fsw_bug_poc { 班级计划 { 私有静态FileSystemWatcher\u FileSystemWatcher; 静态void Main(字符串[]参数) { _fileSystemWatcher=新的fileSystemWatcher(“监视的”,“*”); _fileSystemWatcher.Changed+=通知; _fileSystemWatcher.Created+=Notify; _fileSystemWat

鉴于该计划:

使用系统;
使用System.IO;
名称空间fsw_bug_poc
{
班级计划
{
私有静态FileSystemWatcher\u FileSystemWatcher;
静态void Main(字符串[]参数)
{
_fileSystemWatcher=新的fileSystemWatcher(“监视的”,“*”);
_fileSystemWatcher.Changed+=通知;
_fileSystemWatcher.Created+=Notify;
_fileSystemWatcher.Deleted+=通知;
_fileSystemWatcher.rename+=Notify;
_fileSystemWatcher.IncludeSubdirectories=true;
_fileSystemWatcher.EnableRaisingEvents=true;
Console.ReadKey(false);
}
私有静态void Notify(对象发送方、文件系统目标)
{
WriteLine($“{e.FullPath}{e.ChangeType}”);
}
}
}
Dockerfile:

FROM mcr.microsoft.com/dotnet/core/runtime:2.2-stretch-slim AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build
WORKDIR /src
COPY ["fsw-bug-poc.csproj", ""]
RUN dotnet restore "fsw-bug-poc.csproj"
COPY . .
WORKDIR "/src/"
RUN dotnet build "fsw-bug-poc.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "fsw-bug-poc.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENV DOTNET_USE_POLLING_FILE_WATCHER=true
RUN mkdir -p /app/Watched
VOLUME /app/Watched
ENTRYPOINT ["dotnet", "fsw-bug-poc.dll"]
根据向Dockerfile添加
ENV DOTNET\u USE\u POLLING\u FILE\u WATCHER=true
修复了FileSystemWatcher在容器内不工作的问题

即使使用此修复程序,在Windows上运行Linux容器并将共享驱动程序装载到卷时,FileSystemWatcher也无法工作:

docker build -t fsw-bug-poc .
docker run -it --rm -v C:\Shared:/app/Watched fsw-bug-poc
修改容器内的文件:

修改共享卷文件夹中的文件:

什么都没发生

有人能解释一下发生了什么事吗?FileSystemWatcher正在使用轮询策略,因此它应该以同样的方式工作,不是吗?

切换到.Watch完成了工作。对于文件系统监视策略来说,它似乎是一个更可移植的实现

PhysicalFileProvider
的当前实现支持
DOTNET\u USE\u POLLING\u FILE\u WATCHER
环境变量。我在
FileSystemWatcher
实现中找不到它的任何引用

使用Microsoft.Extensions.FileProviders;
使用Microsoft.Extensions.Primitives;
使用制度;
使用System.IO;
名称空间fsw_bug_poc
{
班级计划
{
私有静态PhysicalFileProvider\u fileProvider;
私有静态IChangeToken\u fileChangeToken;
静态void Main(字符串[]参数)
{
_fileProvider=new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(),“));
WatchForFileChanges();
Console.ReadKey(false);
}
私有静态void WatchForFileChanges()
{
_fileChangeToken=_fileProvider.Watch(“*”);
_fileChangeToken.RegisterChangeCallback(通知,默认值);
}
私有静态无效通知(对象状态)
{
Console.WriteLine(“检测到文件更改”);
WatchForFileChanges();
}
}
}

过去,Windows文件通知仅在Windows计算机上起作用。它们在AIX、Linux或我当时正在使用的OS/400上使用SMB共享时不起作用。我以前必须对这些共享进行投票以确定是否有更改。我不确定这是否会影响FileSystemWatcher策略-read=>UsePollingFileWatcher@SirRufo你可能是对的。我原以为FileSystemWatcher在暗中使用它,但事实似乎恰恰相反:
\u fileChangeToken
<代码>专用IChangeToken\u文件更改Token