使用 C#/.Net 时只读如何影响目录?

2023-12-12

我发现我可以写入(例如,将文件复制到)只读目录。也就是说,一个目录...Attributes = FileAttributes.ReadOnly.我什至可以改变它的名字。我发现唯一不能做的就是删除它。这真的是唯一的事情吗?ReadOnly防止?

EDIT:

这是代码:(目录是空的。)

(new DirectoryInfo(path)).Attributes = FileAttributes.ReadOnly;
Directory.Delete(path);

它抛出一个Access to the path 'c:\... is denied.例外。

但改变之后ReadOnly to Normal效果很好。

So what does a ReadOnly可以预防,但它不能预防什么? (当然,以编程方式。Not:通过 Windows 资源管理器。)

EDIT 2:

我收到了链接到文档的答案,内容如下ReadOnly在目录上不被尊重,并且它可能是.Net这就是删除失败的原因。所以我将重新表述这个问题:“只读如何影响目录使用 C#/.Net 时 ?".


正如 Damien_The_Un believer 提到的,如果我们查看 FILE_ATTRIBUTE_READONLY 的 Win32 API,它会提到:

目录不支持此属性。

也可以看看:http://go.microsoft.com/fwlink/p/?linkid=125896

因此,您似乎确实可以使用 win32 或资源管理器简单地删除此类目录。然而,.NET 似乎在删除目录之前检查目录上的标志。您可以通过在 Directory.Delete 上使用 DotPeek 或 Reflector 来查看这一点。这就是导致“访问被拒绝”错误的原因。

EDIT:

我更详细地研究了这一点,似乎不是 .NET 引发了访问被拒绝错误。考虑以下测试代码:

using System;
using System.IO;
using System.Runtime.InteropServices;

namespace ReadOnlyDirTest
{
   class Program
   {
      [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true, BestFitMapping = false)]
      extern static bool RemoveDirectory(string path);

      static String CreateTempDir()
      {
         String tempDir;
         do
         {
            tempDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
         } while (Directory.Exists(tempDir));

         Directory.CreateDirectory(tempDir);
         return tempDir;
      }

      static void Main(string[] args)
      {
         var tempDir = CreateTempDir();

         // Set readonly.
         new DirectoryInfo(tempDir).Attributes |= FileAttributes.ReadOnly;

         try
         {
            Directory.Delete(tempDir);
         }
         catch (Exception e)
         {
            Console.WriteLine("Directory.Delete: " + e.Message);
         }

         if (!Directory.Exists(tempDir))
            Console.WriteLine("Directory.Delete deleted directory");

         try
         {
            if (!RemoveDirectory(tempDir))
               Console.WriteLine("RemoveDirectory Win32 error: " + Marshal.GetLastWin32Error().ToString());
         }
         catch (Exception e)
         {
            Console.WriteLine("RemoveDirectory: " + e.Message);
         }

         if (!Directory.Exists(tempDir))
            Console.WriteLine("RemoveDirectory deleted directory");

         // Try again without readonly, for both.
         tempDir = CreateTempDir();
         Directory.Delete(tempDir);
         Console.WriteLine("Directory.Delete: removed normal directory");

         tempDir = CreateTempDir();
         if (!RemoveDirectory(tempDir))
            Console.WriteLine("RemoveDirectory: could not remove directory, error is " + Marshal.GetLastWin32Error().ToString());
         else
            Console.WriteLine("RemoveDirectory: removed normal directory");

         Console.ReadLine();
      }
   }
}

在我的机器(win 7)上运行它,我得到以下输出:



    Directory.Delete: Access to the path 'C:\...\Local\Temp\a4udkkax.jcy' is denied.
    RemoveDirectory Win32 error: 5
    Directory.Delete: removed normal directory
    RemoveDirectory: removed normal directory
  

我们看到错误代码 5,根据http://msdn.microsoft.com/en-gb/library/windows/desktop/ms681382(v=vs.85).aspx,是拒绝访问错误。

然后我只能假设资源管理器在删除目录之前取消设置只读属性,这当然很容易完成。命令rmdir还删除标记为只读的目录。

正如文档表明的那样,只读标志不应在目录上受到尊重(即使它似乎在 Win 7 中),我不会依赖这种行为。换句话说,我不会依赖只读来阻止任何事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 C#/.Net 时只读如何影响目录? 的相关文章

  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • Windows 目录永远不会包含临时文件的非 ASCII 字符?

    在 Windows 上使用 MinGW 7 3 0 由于 Windows 限制 Hunspell 无法从包含非 ASCII 字符的位置加载字典文件 我已经尝试了所有方法 1 现在我将文件复制到没有 ASCII 字符的路径 然后再将其交给 H
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 无法将我自己的域添加到 google api 通知端点

    我正在尝试使用谷歌推送通知 我已经关注了此处列出的注册过程 简而言之 我的领域已在 https 中验证在 Google 网站管理员工具中 但是 当我尝试添加通知端点在 Google Cloud Console 中 我收到以下错误 You d
  • (git tfs fetch)TF400324:Team Foundation 服务不可用,底层连接已关闭

    我使用 git tfs 已经快 5 年了 然后有一天我在运行时遇到以下错误git tfs fetch TF400324 Team Foundation services are not available from server https
  • 如何在低于 KitKat 的 Android 版本的 Android WebView 中重置代理?

    我使用以下 2 种方法在 Android WebView 中为 Android 版本 ICS 和 JB 设置代理 但我无法重置 删除这两个版本的代理 如何重置 删除通过这些方法设置的代理 For ICS private static boo
  • 使用 Perl 获取 WMI 内存值

    我需要使用WMI收集Windows操作系统的内存数据 从这个意义上说 我开发了一个 Perl 脚本来生成此类数据 但是 我想知道我的方法是否正确以及有哪些替代方案 收集数据的方法旨在尽可能广泛地应用于 Windows 操作系统 如果你不是一
  • 信中信,模式识别

    我想检测这种模式 正如您所看到的 它基本上是一个字母 C 位于另一个字母内部 具有不同的方向 我的模式可以相互包含多个 C 我发布的带有 2 个 C 的模式只是一个示例 我想检测有多少个 C 以及每个 C 的方向 现在我已经成功地检测到了这
  • 如何检索用于编译给定 ELF 可执行文件的 GCC 版本?

    我想检索用于编译给定可执行文件的 GCC 版本 我试过readelf但没有得到信息 有什么想法吗 一般存放在评论区 strings a
  • Vagrant 端口转发不起作用。主机无法访问杯子

    所以我正在使用 vagrant 并尝试将其用作打印服务器 我安装了杯子 内部一切正常 我什至可以快速做一个curl到我的本地主机 631 我的流浪汉中的杯子端口 一切都有 问题是我无法以任何方式从主机尝试访问它 显然我转发了端口并且尝试了多
  • SQL从查询中的数据中选择该数据尚未在数据库中?

    我想在进行 Web 服务调用之前检查数据库中已记录的记录 这是我想象的查询的样子 我只是似乎无法弄清楚语法 SELECT FROM 1 2 3 4 as temp table WHERE temp table id LEFT JOIN ta
  • Objective-C:查找字符串中的数字

    我有一个包含单词和数字的字符串 如何从字符串中提取该数字 NSString str This is my string 1234 我希望能够将 1234 作为 int 去掉 每次我搜索该字符串时 该字符串都会有不同的数字和单词 Ideas
  • JavaScript - 获取图像特定区域的平均颜色

    我需要使用以下命令从图像的矩形区域获取平均颜色JavaScript 我尝试使用tracking js但它不允许指定区域而不是单个像素 如果您需要获取单个像素的平均颜色 而不是矩形区域的颜色 请看一下另一个问题 鼠标悬停时从画布获取像素颜色
  • 为什么 Content-Disposition 标头在 IE 8 中不起作用?

    我正在尝试将文本文件 CSV 流式传输到响应 并且以下代码在 Firefox 3 中完美运行 但是当我使用 IE 时 它看起来想要下载实际的 aspx 页面 并抱怨该文件内容与文件扩展名或类型不匹配 如果我随后选择下载该文件 它会正确下载
  • 无法在“C”程序中打印欧元符号

    我无法打印欧元符号 我正在使用的程序如下 我已将字符集设置为代码页 1250其中 0x80 代表欧元符号 Program include
  • Android:旋转器上的 getSelectedItem 问题

    我有一个Spinner 并将所选项目放入邮件正文中 这是我的代码 Override protected void onCreate Bundle savedInstanceState super onCreate savedInstance
  • 文本不透明度渐变

    我希望使文本看起来在边缘淡出 这是我到目前为止所拥有的 struct ContentView View var body some View ZStack Color red Text Hello world blendMode lumin
  • Java 球衣 RESTful Web 服务请求

    我一直在关注有关宁静服务的教程 效果很好 不过 有些事情我还不太明白 它看起来是这样的 Path hello public class Hello This method is called if TEXT PLAIN is request
  • ftell/fseek 与 /sys/class 文件中实际可读数据长度不同

    嵌入式Linux系统 ls al sys class xxxx r r r 4096 ftell lstat st size 返回 4096 fread fp 1 4096 buf 返回 3 实际上 使用vi打开文件只有3个字节 有什么问题
  • [NSManagedObjectContext删除:]:无法识别的选择器发送到实例

    核心数据让我心烦意乱 我正在删除旧数据并希望插入从服务器收到的新数据 现在删除部分给出了 sigabort NSManagedObjectContext删除 无法识别的选择器发送到实例0x522f550 2013 09 27 14 05 5
  • 使用Sinon的假定时器时setTimeout未触发

    我有一个类似于下图所示的测试 基本上我想测试特定方法是否被延迟 以下示例按预期工作 即调用解析方法并且测试通过 it should delay execution by 1 second function const clock sandb
  • 类型错误:不可散列的类型

    我正在尝试获取元组列表的列表 类似 1 0 2 0 3 0 1 1 2 1 3 1 我用了这个声明 set a b for a in range 3 for b in range 3 但这给了我一个错误 TypeError unhashab
  • 使用 C#/.Net 时只读如何影响目录?

    我发现我可以写入 例如 将文件复制到 只读目录 也就是说 一个目录 Attributes FileAttributes ReadOnly 我什至可以改变它的名字 我发现唯一不能做的就是删除它 这真的是唯一的事情吗 ReadOnly防止 ED