我正在使用以下代码打开一个文件,用于读取我之前在用户的%TEMP%文件夹中创建的文件:
new FileStream(cacheFileName,FileMode.Open,FileAccess.Read,FileShare.Read | FileShare.Delete);

在某些用户的计算机上,这有时会抛出UnauthorizedAccessException,并显示消息“访问路径…被拒绝”.我无法重现这一点.我最初的猜测是反病毒或索引引擎正在做一些时髦的事情,但我也注意到这段代码正在使用“FileShare.Delete”,我不确定应该在那里.

是否存在使用“FileShare.Delete”导致UnauthorizedAccessException的情况?

解决方法

是的,FileShare.Delete往往会导致此问题.由在后台运行的任何程序使用,扫描文件,文件索引器和病毒扫描程序是常见示例.

FileShare.Delete允许其他进程删除该文件,即使后台进程仍然打开了文件并正在从中读取.其他进程将忘记文件实际上没有消失,因为它知道文件实际上已被删除.

当其他进程依赖于实际被删除的文件并执行其他操作时,麻烦就开始了.通常通过创建具有相同名称的新文件来触发.值得注意的是,保存文件是一种非常不明智的方法,因为当保存失败时,如果没有备份就会导致完全数据丢失,但这种错误很常见.

这将失败,因为该文件的目录条目仍然存在,它将不会消失,直到打开文件的最后一个进程关闭句柄.尝试再次打开文件的任何其他进程将被错误5,“访问被拒绝”.包括删除文件并尝试重新创建文件的进程.

解决方法是始终使用“事务”保存,在尝试覆盖之前重命名文件.在.NET中使用File.Replace(),在带有ReplaceFile()的本机winapi中.手动也很容易,工作流程是:

>删除备份文件,如果失败则停止
>将旧文件重命名为备份文件名,如果失败则停止
>使用原始文件名写入新文件,如果失败则重命名备份
>删除备份文件,忽略失败

步骤2确保永远不会有任何数据丢失,如果出现任何问题,原始文件将保持不变.步骤4确保FileShare.Delete按预期工作,当其他进程关闭其句柄时,该备份文件最终将消失.

c# – 可以使用FileShare.Delete导致UnauthorizedAccessException吗?的更多相关文章

  1. ios – 重命名Xcode项目后出现NSKeyedUnarchiver错误

    解决方法不要更改项目名称.只需更改显示名称即可.它是Info.plist中的“Bundledisplayname”条目.您可能需要添加条目.如果要更改OSX应用程序的显示名称,请参阅thisanswer.

  2. 无法重命名Xcode 4中的组文件夹

    我今天在Xcode4中添加了一个新的组,其中包含几个文件.由于某种原因,这已经包含了一段时间,我无法命名或重命名组文件夹.以前有人发生过这种情况吗?解决方法你为了重命名而尝试做什么?上下文菜单不提供重命名选项.所以我也是>选择组>点击返回选择它进行编辑要么>选择组>短暂的延迟再次单击它

  3. xcode – 批量重命名我的类以更改我的项目前缀?

    Xcode现在不知道我的文件在哪里.为了解决这个问题,我打开了.pbxproj文件并进行了另一次仔细搜索和替换.这是一个涉及的过程,我希望有一个工具或Xcode功能来帮助我做到这一点,但唉,还没有.

  4. Xcode和SVN:无法重命名我的类 – >错误:155007(路径不是工作副本目录)

    我读了this.我也发现了类似的problem.但到目前为止还没有解决方案.解决方法我遇到了同样的问题,谷歌指导我这个问题,所以为迟到的’回答’道歉.无论如何,我正在研究eclipse3.5,macosx雪豹,你似乎也在使用macosx?关键是,macosx’hfs-filesystem大多数情况下设置不区分大小写,所以因为你只是想改变文件名的大小写,这可能是你的问题.我的解决方法是从FOO.h到Foo.h执行重命名:>FOO.h–>foobar.h中>FooBar.h–>foo.h中

  5. swift tableview中添加侧滑删除功能 类似qq删除

    在UITableViewDelegate中继承三个方法functableView(tableView:UITableView,canEditRowAtIndexPathindexPath:NSIndexPath)->BoolfunctableView(tableView:UITableView,editingStyleForRowAtIndexPathindexPath:NSIndexPath)-

  6. swift http post/get/delete/put

    Swift中的HTTP请求iOS开发中大部分App的网络数据交换是基于HTTP协议的。这个库通过封装NSURLSession,提供了GET/POST/PUT/DELETE以及上传和下载的支持,比较全面:4.使用Objective-C中的AFNetworking网络库AFNetworking库是在iOS开发领域享有盛名、功能强大的网络请求库。

  7. 使用swift开发OSX应用

    选择Swift作为开发语言,保持所有选项框反选,documentextension栏保留为空白。确保“AlsocreateXIBfileforuserinterface”为勾选,然后点Next。需要注意的是,在MacApp中,有大量的类和iOS中都类似,只不过是以NS前缀命名。在applicationDidFinishLaunching方法内,加入以下语句:masterViewController=MasterViewControllerwindow.contentView.addSubviewmaste

  8. 制作一个可以滑动操作的 Table View Cell

    本教程将会向你展示如何制作一个这样的TableViewCell,而不用因嵌套的ScrollView陷入困境。如果你还不知道一个可滑动的TableViewCell意味着什么,那么看看Apple的邮件应用:可能你会想,既然Apple展示了这种方案,那它应该已将其开放给开发者使用了。这会要求你深入研究iOS7UITableViewCell的结构,以便复制出我们需要的行为。打开MasterViewController.m并找到viewDidLoad。这个循环添加了一些字符串到_objects数组,应用运行时,这些

  9. 【译】哥们儿,我的方法哪儿去了?

    想象有一天你正在给Swift编译器喂一些看起来无害的代码。然后一个冲击波打来:它们哪儿去了?让我再加点方便方法吧。

  10. 从Coredata Swift中删除数据

    而我正在尝试删除一个项目。更新我的编码问题,执行swift和coredata中的数据删除。这个代码我结束了,工作。编辑上面的Swift2.2和Xcode7.3.1还需要这两行代码来纠正。

随机推荐

  1. c# – (wpf)Application.Current.Resources vs FindResource

    所以,我正在使用C#中的WPF创建一个GUI.它看起来像这样:它现在还没有完成.这两行是我尝试制作一种数据表,它们在XAML中是硬编码的.现在,我正在C#中实现添加新的水果按钮功能.我在XAML中有以下样式来控制行的背景图像应该是什么样子:因此,在代码中,我为每列col0,col1和col2创建一个图像,如果我使用以下代码,它添加了一个如下所示的新行:如你所见,它不太正确……为什么一个似乎忽略了一些属性而另一个没有?

  2. c# – 绑定DataGridTemplateColumn

    似乎我已经打了个墙,试图在DataGrid上使用DataTemplates.我想要做的是使用一个模板来显示每个单元格的两行文本.但是似乎无法以任何方式绑定列.以下代码希望显示我想做的事情.注意每个列的绑定:模板列没有这样的东西,因此,这个xaml不可能工作.我注定要将整个DataTemplate复制到每个列,只是对每个副本都有不同的约束?解决方法我不完全确定你想要做什么,但如果您需要获取整行的DataContext,可以使用RelativeSource绑定来移动视觉树.像这样:

  3. c# – 学习设计模式的资源

    最近我来到了这个设计模式的概念,并对此感到非常热情.你能建议一些帮助我深入设计模式的资源吗?

  4. c# – 是否有支持嵌入HTML页面的跨操作系统GUI框架?

    我想开发一个桌面应用程序来使用跨系统,是否有一个GUI框架,允许我为所有3个平台编写一次代码,并具有完全可脚本化的嵌入式Web组件?我需要它有一个API来在应用程序和网页之间进行交流.我知道C#,JavaScript和一些python.解决方法Qt有这样的事情QWebView.

  5. c# – 通过字符串在对象图中查找属性

    我试图使用任意字符串访问嵌套类结构的各个部分.给出以下(设计的)类:我想要从Person对象的一个实例的“PersonsAddress.HousePhone.Number”获取对象.目前我正在使用反思来做一些简单的递归查找,但是我希望有一些忍者有更好的想法.作为参考,这里是我开发的(crappy)方法:解决方法您可以简单地使用标准的.NETDataBinder.EvalMethod,像这样:

  6. c# – 文件下载后更新页面

    FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7&displaylang=en&pf=true它呈现该页面,然后使用以下元刷新标签来实际向用户提供要下载的文件:你可能需要在你的应用程序中做类似的事情.但是,如果您真的有兴趣在文件完全下载后执行某些操作,那么您的运气不佳,因为没有任何事件可以与浏览器进行通信.执行此操作的唯一方法是上传附件时使用的AJAXupload.

  7. c# – 如何在每个机器应用程序中实现单个实例?

    我必须限制我的.net4WPF应用程序,以便每台机器只能运行一次.请注意,我说每个机器,而不是每个会话.我使用一个简单的互斥体实现单实例应用程序,直到现在,但不幸的是,这样一个互斥是每个会话.有没有办法创建机器互连,还是有其他解决方案来实现每个机器应用程序的单个实例?

  8. c# – WCF和多个主机头

    我的雇主网站有多个主机名,都是同一个服务器,我们只是显示不同的皮肤来进行品牌宣传.不幸的是,在这种情况下,WCF似乎不能很好地工作.我试过overridingthedefaulthostwithacustomhostfactory.这不是一个可以接受的解决方案,因为它需要从所有主机工作,而不仅仅是1.我也看过thisblogpost,但是我无法让它工作,或者不是为了解决我的问题.我得到的错误是“这

  9. c# – ASP.NET MVC模型绑定与表单元素名称中的虚线

    我一直在搜索互联网,试图找到一种方式来容纳我的表单元素的破折号到ASP.NET的控制器在MVC2,3或甚至4中的默认模型绑定行为.作为一名前端开发人员,我更喜欢在我的CSS中使用camelCase或下划线进行破折号.在我的标记中,我想要做的是这样的:在控制器中,我会传入一个C#对象,看起来像这样:有没有办法通过一些正则表达式或其他行为来扩展Controller类来适应这种情况?我讨厌这样的事实,我必须这样做:甚至这个:思考?

  10. c# – 用户界面设计工具

    我正在寻找一个用户界面设计工具来显示文档中可能的GUI.我不能生成代码.我知道MicrosoftVisio提供了一个功能.但有什么办法吗?您使用哪种软件可视化GUI?

返回
顶部