- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在测试有关写入/创建/删除文件的一些事情时,我编写了以下程序,循环删除和创建文件 n 次。
static string path = @"C:\Users\Remy\Desktop\Testing";
static readonly int sampleSize = 10000; // Amount of iterations the methods will be run for.
static byte[] sourceFile;
static void Main(string[] args)
{
using (FileStream fs = new FileStream(path + @"\SourceFile.txt", FileMode.Open, FileAccess.Read))
{
sourceFile = new byte[fs.Length];
fs.Read(sourceFile, 0, sourceFile.Length);
}
string filePath = path + @"\Destination.txt";
for (int i = 0; i < sampleSize; i++)
{
if (File.Exists(filePath))
{
File.SetAttributes(filePath, FileAttributes.Normal);
File.Delete(filePath);//Error sometimes throws here.
}
using (FileStream file = File.OpenWrite(filePath))
{
file.Write(sourceFile, 0, sourceFile.Length);
}
}
Console.ReadLine();
}
当迭代次数不太高(大约 1000 次)时,此程序大部分时间都按预期运行。它将删除旧文件并创建一个新文件。
然而,当我将迭代次数增加到 10000/100000 时,问题出现在极少数情况下(大约 0.03% 的时间),它在 using (FileStream file = File.OpenWrite(filePath))
,同时在其他 99.97% 的时间内成功通过。当错误抛出时,文件不会被创建。
这在使用调试/发布的 VS(作为管理员)中以及在以管理员身份运行的构建 .exe 中都会发生。
在查看此问题时,我发现了以下有关 Unauth...
异常的答案。
我还添加了父文件夹的权限,以允许 完全控制
到所有文件和子文件夹的 Everyone
。
起初我想也许我正在创建的文件不够大(目前写入 976kb 的随机数据)并且由于某种原因程序迭代创建/删除的速度比操作系统/硬盘可以处理的更快。但是增加文件大小时会发生相同的行为
我已经在 3 台机器上对其进行了测试,并且在所有机器上都发生了这种情况。
这可能是 Windows 因误报而抛出异常的情况吗?看到它只发生在大的迭代中吗?我在这里错过了完全不同的东西吗?
注意:我不是在寻找处理异常的方法。我能应付。我正在寻找发生这种奇怪行为的原因为什么,以及如果可能防止而不是治愈
环境
我要写入的磁盘是 Crucial MX300 SSD,使用没有 RAID 的 sata 3。 16 GB 内存。操作系统 Windows 10(专业版)64 位。运行程序时,系统尽可能空闲。
控制台应用程序针对 .NET Framework 4.6.1 构建,使用 Visual Studio 2017 和 Release Any CPU 设置。
我根据评论建议尝试的其他事情:
我尝试在创建和删除后添加一个 Thread.Sleep
以确保 Windows 能够清除文件缓存。这仍然会抛出异常,但这次它会在 File.Delete(filePath); 上抛出异常。
代替。
关闭 Windows Defender 等也会产生在 File.Delete(filePath)
而不是 using(FIleStream....)
上抛出错误的结果。
改为使用以下内容写入文件:
using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Write, FileShare.None))
{
file.Write(sourceFile, 0, sourceFile.Length); file.Flush(flushToDisk: true);
}
也产生同样的异常被抛出
最佳答案
这种问题是没法解决的,唯一的办法就是预防或避免,如果操作失败,做一些日志。如果失败,请多次尝试这样的操作。之前我已经创建了一个,这里是代码片段。
public IList<string> ReadLineByLineFromFile( string filePath )
{
const int numberOfRetries = 3;
const int delayOnRetry = 500;
bool success = false;
List<string> logs = null;
for ( int i = 0; i <= numberOfRetries && success == false; i++ )
{
try
{
logs = new List<string>();
const Int32 bufferSize = 128;
using ( var fileStream = File.Open( filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite ) )
using ( var streamReader = new StreamReader( fileStream, Encoding.UTF8, true, bufferSize ) )
{
string line;
while ( ( line = streamReader.ReadLine() ) != null )
{
logs.Add( line );
}
}
success = true;
}
catch ( IOException ex ) when ( i < numberOfRetries )
{
Local.Instance().Logger.Warn( ex, "Retrying reading logs from file path {0}, retry count {1} with dealy {2} ms.", filePath, i + 1,
delayOnRetry );
System.Threading.Thread.Sleep( delayOnRetry );
}
}
GC.Collect();
return logs;
}
关于c# - 删除/创建文件在多次迭代后抛出 System.UnauthorizedAccessException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54530134/
我发现运行良好的代码片段可以轻松创建模块化 Delphi 应用程序。此代码适用于 Delphi 5 版本。 链接到片段 -> http://delphi.cjcsoft.net/viewthread.
我正在通过下面的代码以编程方式创建搜索索引。问题是插入设计文档后如何建立索引?或者它是第一次由 .search() 方法使用构建? var book_indexer = function(doc) {
我有一个非常小的项目,我想创建一个设置表单。做这个的最好方式是什么?简单地创建另一个带有复选框/文本框的 Windows 窗体并使用 Properties.Settings 类保存这些设置?它可能会起
我试图通过引用已经存在的 dm-linear、dm-snapshot、dm-cache 等来实现设备映射器目标。在我的实现中,我需要对某个扇区范围执行读/修改/写操作。由于设备映射器直接与块层对话,我
现在我有了一些空闲时间,我决定创建一个 Java 程序来将我的 XBee(即 zigbee)芯片连接到我的新 SmartThings 集线器。我找到了一个很好的教程,通过手动创建数据包来完成此操作(
我有一系列这种形式的静态实用方法: StringBuffer Util.doA(String arg0, String arg1, SomeEnum e); StringBuffer Util.do
我有一个 d3dDevice: ComPtrd3dDevice; 我在这里将它用于 dxgiDevice: ComPtr dxgiDevice2; HRESULT hr; hr
如何仅使用 css(样式)为我的 react-native View 组件背景创建此设计? 我希望 View 2 具有绿色背景,顶部有一条小曲线,与右上角的中心相交。 仅使用 borderRadius
我正在尝试创建一个有点动态的 html 类,它根据类末尾包含的数字设置宽度 %。注意:类名将始终以“gallery-item-”开头 示例:div.gallery-item-20 = 20% 宽度 我
基本上,我想要创 build 备方向值 alpha、beta 和 gamma 的可视化表示。到目前为止,我已经设法使用 innerHTML 以纯文本形式显示值,但我想为每个值创建一系列“条形图”。我根
我想用 Java 创 build 计二维码。 设计二维码可能包含图形形式的 Logo 。下面是此类设计代码的示例。 如何创建这样的二维码? 最佳答案 我刚刚找到了一个可以创建此类 QR 码的软件。 T
据我了解,SyncResponse 的有效负载是一个 Device 类型的数组。 我的问题是我无法创建在 SyncResponse - Payload - Device 内部定义的设备类型实例(无权访
我现在正在考虑如何创建类似以下事实的 android 应用程序... 起始页是 gridview,显示的列数将基于在设备屏幕分辨率上 当我点击 gridview 上的一项时,以下屏幕将根据设备分辨率显
我正在开发设备 onwer 应用程序,其中我必须使用 NFC 作为设备所有者安装我的应用程序,但是当我触摸两个设备并尝试安装应用程序时出现错误“由于校验和错误无法安装管理应用程序” 请告诉我哪里做错了
如何在不使用 mknod 或 MAKEDEV 的情况下(即通过使用动态注册)创 build 备文件。 最佳答案 假设你想在插入时动态分配一个主设备号给一个字符设备,使用: int alloc_chrd
我正在使用 .NET 为 IE 开发工具栏。目前,我使用 gacutil 插入我的 .NET 程序集,并使用 regasm 注册我的 COM 程序集。 我想为项目创建一个设置 (MSI),但我似乎无法
在为设置页面创建 Activity 后,我注意到 if (mCurrentValue !== value) 中的 mCurrentValue !== value 返回警告: Identity equa
我正在为用 C# 开发的软件开发设置表单。我正在研究不同的软件如何实现它们的设置表单。 在我遇到的大多数情况下,他们似乎在表单的左 Pane 中使用 Treeview,在右 Pane 中使用配置设置。
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我正在尝试从 NodeJS 后端创建文档 ( https://firebase.google.com/docs/cloud-messaging/js/device-group ) 中所述的设备组,但我
我是一名优秀的程序员,十分优秀!