65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 chmod 和 monodevelop 更改 Linux 文件权限的简单项目

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2018年1月8日

CPOL

1分钟阅读

viewsIcon

10701

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

© . All rights reserved.