使用 chmod 和 monodevelop 更改 Linux 文件权限的简单项目
monodevelop 中文件权限的简单解决方法
引言
你好,世界!(抱歉,觉得这很有趣),目前在 MonoDevelop 中,当我尝试在 Linux (Ubuntu 16.04 i386) 中更改文件权限时,使用System.Security.AccessControl.FileSecurity 更改文件权限时,会遇到“此平台上不支持”的错误,这促使我为 chmod 构建了这个封装器。
背景
这个想法源于我需要提供一种方法来使自定义生成的 Chrome 应用桌面启动器可执行。我们可以简单地使用下面的代码,但对于其他不同的场景呢? 这就是我的简单封装器的起点。
System.Diagnostic.Process.Start("chmod", "755 $APPNAME$");
使用代码
今天我们将要查看的类如下所示。 如果您不熟悉 chmod,可以查看其 man 页面 这里。
1. [enum
] FileAccess.cs。
FileAccess
代表 chmod 的单个八进制值 (3 个中的 1)。
using System;
namespace Linux.FileSecurity
{
public enum FileAccess
{
None = 0,
Execute = 1,
Write = 2,
Read = 4,
}
}
2. [struct
] FilePermissionFlag.cs。
FilePermissionFlag
代表 chmod U(ser),G(roup),O(ther) 所需的 3 个八进制值。
using System;
namespace Linux.FileSecurity
{
public struct FilePermissionFlag
{
public FileAccess User
{
get;
private set;
}
public FileAccess Group
{
get;
private set;
}
public FileAccess Others
{
get;
private set;
}
internal FilePermissionFlag(FileAccess User, FileAccess Group, FileAccess Others)
{
this.User = FilePermissionFlag.ToValidAccess(User);
this.Group = FilePermissionFlag.ToValidAccess(Group);
this.Others = FilePermissionFlag.ToValidAccess(Others);
}
public static FileAccess ToValidAccess(FileAccess Access)
{
//file access should be 0 to 7
int num = (int)Access;
return (FileAccess)(num < 0 ? 0 : num > 7 ? 7 : num);
}
}
}
3. [static class
] KnownAccess.cs。
KnownAccess
包含已知的 FileAccess
值。 请注意缺少 FileAccess.Execute
(编写代码时的后见之明)
using System;
namespace Linux.FileSecurity
{
public static class KnownAccess
{
public static readonly FileAccess None = FileAccess.None;
public static readonly FileAccess Read = FileAccess.Read;
public static readonly FileAccess Write = FileAccess.Write;
public static readonly FileAccess Execute = FileAccess.Execute;
public static readonly FileAccess Read_Write = FileAccess.Read | FileAccess.Write;
public static readonly FileAccess Read_Execute = FileAccess.Read | FileAccess.Execute;
public static readonly FileAccess Write_Execute = FileAccess.Write | FileAccess.Execute;
public static readonly FileAccess Read_Write_Execute = FileAccess.Read |FileAccess.Write | FileAccess.Execute;
}
}
4. [sealed class
] FilePermission.cs。
FilePermission
接收文件路径,并使用给定的 FilePermissionFlag
对文件运行 chmod 命令。
using System;
namespace Linux.FileSecurity
{
public sealed class FilePermission
{
const string File = "chmod";
public string Process
{
get;
private set;
}
public FilePermissionFlag Flags
{
get;
private set;
}
public override string ToString ()
{
return string.Format ("{0}{1}{2} {3}",
(int)FilePermissionFlag.ToValidAccess(Flags.User),
(int)FilePermissionFlag.ToValidAccess(Flags.Group),
(int)FilePermissionFlag.ToValidAccess(Flags.Others),
Process);
}
public FilePermission (string filePath)
{
if (!System.IO.File.Exists (filePath))
throw new System.IO.FileLoadException ("error loading " + filePath, filePath);
this.Process = filePath;
}
public FilePermission(FilePermission permission, FileAccess user, FileAccess group, FileAccess others)
: this(permission.Process, user, group, others)
{
}
public static FilePermission SetPermission(string filePath, FileAccess user, FileAccess group, FileAccess others)
{
FilePermission permission = new FilePermission (filePath);
permission.Flags = new FilePermissionFlag (user, group, others);
return permission.Apply ();
}
public void Apply(FileAccess user, FileAccess group, FileAccess others)
{
this.Flags = new FilePermissionFlag (user, group, others);
this.Apply ();
}
private FilePermission Apply()
{
if (string.IsNullOrWhiteSpace (Process) || string.IsNullOrEmpty(Process))
{
Console.WriteLine ("File name cannot be empty.");
return null;
}
if (!System.IO.File.Exists (Process))
{
Console.WriteLine ("Error finding file " + Process + ".");
return null;
}
try
{
string permission = this.ToString();
System.Diagnostics.ProcessStartInfo filePermission =
new System.Diagnostics.ProcessStartInfo (
FilePermission.File, permission);
System.Diagnostics.Process.Start(filePermission);
return this;
}
catch
{
return null;
}
}
}
}
关注点
编写这个解决方法很有趣且直观,并且学到了很多关于 chmod 的知识,任何评论、疑虑、问题都可以在下面留言。
历史
1. 2018 年 1 月 8 日 v1.0