Directory.CreateDirectory "Could not find file..."错误



堆栈溢出。我们又见面了/叹息

是只有我还是其他人从Directory.CreateDirectory.收到了奇怪的消息

是只有我一个人,还是其他人的代码多年来一直运行得很完美,但在代码根本没有更改的情况下,却突然莫名其妙地随机出错?

运行windows 10,VS2019。所有项目都是.NET Core 3.1或.NET Std 2.0/2.1。

无论如何,我有这个代码ISettingsProvider,它是由我的类实现的,用于管理应用程序设置。(以xml格式存储)在该类构造函数中,我传入一个字符串,表示将存储设置的xml文件的文件路径。如果该文件还不存在,我会获取文件夹路径ala path.GetDirectoryName,并检查它是否存在,如果它没有创建它,然后向该文件夹写入一个空的设置文件。其他明智的做法是什么都不做,因为我们将在之后立即从文件中读取数据。

下面是该类的构造函数。同样,这段代码多年来一直完美地为我工作,跨越多个平台版本和项目,.net pcl 3.5 4.6.net Std,Unity3D等

/// <summary>
/// Initializes a new instance of the <see cref="XmlSettingsProvider"/> class.
/// </summary>
/// <param name="fileName">
/// The file name.
/// </param>
/// <param name="create"><c>true</c> Create the settings file immediately if one does not exist.</param>
/// <exception cref="ArgumentNullException">
/// If <see cref="fileName"/> is null or empty.
/// </exception>
public XmlSettingsProvider(string fileName, bool create)
{
if (string.IsNullOrEmpty(fileName))
{
throw new ArgumentNullException(nameof(fileName));
}
var directoryName = Path.GetDirectoryName(fileName);
if (directoryName != null && directoryName.IndexOfAny(Path.GetInvalidPathChars()) != -1)
{
throw new Exception("Invalid path characters detected!");
}
var name = Path.GetFileName(fileName);
if (name != null && name.IndexOfAny(Path.GetInvalidFileNameChars()) != -1)
{
throw new Exception("Invalid filename characters detected!");
}
this.readDelayInSeconds = 5;
this.FileName = fileName;
if (create && !File.Exists(fileName))
{
var doc = new XmlDocument();
var declaration = doc.CreateXmlDeclaration("1.0", null, null);
var settings = doc.CreateElement("settings");
doc.AppendChild(settings);
doc.InsertBefore(declaration, doc.DocumentElement);
Directory.CreateDirectory(directoryName);
using (var stream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
{
doc.Save(stream);
}
}
this.Read();
}

问题出在Directory.CreateDirectory上。我正试图在"d:\documents\StockWatchWpfCore"上创建一个目录,其中"d:\documents"存在,并且是我的windows 10"我的文档"文件夹,而"d:\ddocuments\StockWatchWpfCore"还不存在。

我想可能是windows 10勒索软件检测阻止了我的应用程序在"d:\documents"中创建文件夹,因为我已将"d:\docments"添加为受保护的文件夹。但我在阻止历史记录中没有收到任何消息表明我的应用程序被阻止。

更糟糕或更令人困惑的是,所提出的异常信息并不是你所期望的。

正在引发的异常数据。

调用堆栈

at System.IO.FileSystem.CreateDirectory(String fullPath, Byte[] securityDescriptor)
at System.IO.Directory.CreateDirectory(String path)
at Codefarts.AppCore.SettingProviders.Xml.XmlSettingsProvider..ctor(String fileName, Boolean create) in P:Code ProjectsCodefarts.AppCoreSetting ProvidersCodefarts.AppCore.SettingProviders.XmlXmlSettingsProvider.cs:line 142
at Codefarts.AppCore.SettingProviders.Xml.XmlSettingsProvider..ctor(String fileName) in P:Code ProjectsCodefarts.AppCoreSetting ProvidersCodefarts.AppCore.SettingProviders.XmlXmlSettingsProvider.cs:line 162
at Codefarts.WpfAppBootstrapper.BootstrappedApp.OnStartup(StartupEventArgs e) in P:Code ProjectsCodefarts.WpfAppBootstrapperBootstrappedApp.cs:line 63
at System.Windows.Application.<.ctor>b__1_0(Object unused)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
at System.Windows.Threading.DispatcherOperation.InvokeImpl()
at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
at MS.Internal.CulturePreservingExecutionContext.CallbackWrapper(Object obj)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)

"System.IO.FileSystem"

消息

"Could not find file 'd:\Documents\StockWatchWpfCore'."

内部异常

null

你注意到错误信息了吗?"找不到文件'd:\Documents\StockWatchWpfCore'。"文件?我使用的是目录而不是文件?!?!

情节越来越浓。。。。。。

因此,在我代码的另一部分中,我已经钩住了AppDomain.ResolveAssembly事件。有趣的是,我一进入Directory.CreateDirectory,ResolveAssemblies事件就会被激发两次,两次都带有相同的请求

名称

"System.IO.FileSystem.resources, Version=4.1.2.0, Culture=en-US, PublicKeyToken=b03f5f7f11d50a3a"   

请求程序集

{System.IO.FileSystem, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a}

我的程序集解析事件代码

private Assembly ResolveAssemblies(object sender, System.ResolveEventArgs args)
{
var folderPaths = new List<string>(this.AssemblySearchFolders);
folderPaths.Add(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
var filter = new AssemblyName(args.Name);
foreach (var folderPath in folderPaths)
{
if (!Directory.Exists(folderPath))
{
continue;
}
var fileMatches = Directory.GetFiles(folderPath, filter.Name + ".dll", SearchOption.AllDirectories);
var assemblyPath = fileMatches.FirstOrDefault();
if (!string.IsNullOrWhiteSpace(assemblyPath) && File.Exists(assemblyPath))
{
return Assembly.LoadFrom(assemblyPath);
}
}
return null;
}

BTW"this.AssemblySearchFolders"是一个空集合。它就在那里,以防我想搜索应用程序安装文件夹以外的其他位置。

好的,在这一点上,.net似乎正在试图解决一个它自己找不到的缺少的程序集引用。因此,我打开了包含XmlSettingsProvider实现的项目。该项目是一个.NET Core 3.1项目类型,包含此项目信息

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AssemblyVersion>2020.5.10.9</AssemblyVersion>
<FileVersion>2020.5.10.9</FileVersion>
</PropertyGroup>
<PropertyGroup>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>       
<ItemGroup>
<ProjectReference Include="....Codefarts.AppCoreNETStdCodefarts.AppCoreNETStd2.csproj" />
</ItemGroup> 
</Project>

请注意,在我开始出现此问题后,我确保在.csproj文件中包含CopyLocalLockFileAssemblies属性。但它不会复制任何对bin文件夹的引用,如"System.IO.FileSystem".

好的,然后我尝试对System.IO.FileSystem进行nuget搜索,发现了这个https://www.nuget.org/packages/System.IO.FileSystem/4.3.0?_src=template

它似乎支持.NET Standard 1.3,但没有提到.NET Core。无论如何,我添加了nuget引用,并进行了重建,然后再次运行了我的应用程序,但仍然存在相同的问题。没有将System.IO.FileSystem.dll复制到bin文件夹,并且AssemblyResolve事件仍在激发,仍在查找丢失的程序集引用。

就在这一点上,我的想法已经用完了,我的理解也到了极限。谷歌也于事无补。这很令人沮丧,因为XmlSettingsProvider代码没有更改,并且在过去两周内一直运行良好。。突然间,它决定放弃,并在最后两天开始给我这个错误。

作为一个简化的测试,我用这段代码启动了一个新的.Net Core 3.1控制台应用程序,我遇到了同样的问题,无法解决System.IO.FileSystem

using System;
using System.IO;
namespace assembly_resolve
{
class Program
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
Directory.CreateDirectory(@"d:documentswpfcore");
}
private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
return args.RequestingAssembly;
}
}
}

为了测试我的理智,我写了这个linqPad6测试代码。

void Main()
{
AppDomain.CurrentDomain.AssemblyResolve += (s, e) =>
{        
return e.RequestingAssembly;
};
Directory.CreateDirectory(@"d:documentsWpfCoreTest");
}

测试代码不会激发AssemblyResolve事件,因为我新发现它不会。还尝试强制关闭系统并重新启动,但没有成功。因此,从.NET Framework到.NET Core,体系结构/行为似乎发生了变化。Ala->https://learn.microsoft.com/en-us/dotnet/api/system.appdomain.assemblyresolve?view=netcore-3.1

也尝试了通过这个冰雹结婚(无耻的插头)http://www.createdbyx.com/createdbyx/post/2016/07/02/MSBuild-Recursively-Copy-Indirect-Project-Dependencies-to-bin.aspx但仍然没有成功。

所以最后,我需要以某种方式指导.net在哪里找到程序集"System.IO.FileSystem"digery,这样它就可以"做事情">

暂停!

更新:第二天。我整晚都在想这件事。我的整个心态都倾向于出问题。NET核心,或者某种用户权限等,所以我在C#和VS2019中创建了额外的控制台项目。NET Framework 4 Client Profile、4.6、4.7、.NET Core 3.1所有这些都不起作用,并且在尝试创建目录时引发了相同的错误。现在我知道他们过去也工作过,但不明白为什么它停止了工作。我还尝试在管理员模式下运行vs2019,但没有成功。发生了什么事?

我注意到它试图查找的程序集的版本号"System.IO.FileSystem.resources,version=4.1.2.0,…"当我查看nuget包时,该包没有4.1.2.0版本。此外,当我查看"C:\Users\Dean.nuget\packages\system.io.filesystem"文件夹时,没有对应的4.1.2文件夹。

所以我现在的想法是,我的系统出现了严重的问题,根本不是我的代码。

然后我试着关闭windows勒索软件保护。。。。他妈的。。。它开始工作了。这让事情变得更有趣,因为在windows勒索软件保护中没有块历史记录报告,表明它正在保护我的系统免受我自己的应用程序代码的攻击?!!?!但我每隔一天就会收到来自系统上其他应用程序的阻止历史记录通知和报告。顺便说一句,我确实添加了vs2019 devenv.exe作为允许的应用程序。

将我的application.exe添加到"通过受控文件夹访问添加应用程序",瞧,它正在工作。还修改了应用程序代码并重新运行,以检查勒索软件保护是否会检测到我的应用程序的不同版本,但它没有。因此,这表明它在第一次创建块规则时没有进行任何类型的crc/文件内容比较检查。

我想知道是不是因为它是一个.net应用程序,勒索软件保护不报告阻止历史。无论如何,问题已经被追踪到,我的理智已经恢复,我正在通过勒索软件保护窗口右侧的"给我们反馈"链接提交错误报告。

最新更新