【vs2005之简单日志工具的制作4文件夹】Vs2005之简单日志工具的制作--4.文件类型注册

更新时间:2015-02-16    来源:班主任工作日志    手机版     字体:

【www.bbyears.com--班主任工作日志】

  文件类型注册的可重用的类在项目FileTypeReg里,而实际使用的类TSysRegeist在MyLog3(即主程序)项目中。

  所谓文件类型注册,实际上是向注册表的HKEY_CLASSES_ROOT项中写入一些相关的数据:首先,在HKEY_CLASSES_ROOT项下建立一个子项,名称即为后缀名,如".ml3"。它有一个默认值,比如"ML3_FileType"。意思是指,".ml3"文件类型的相关数据存储在HKEY_CLASSES_ROOT下的"ML3_FileType"这个子项里面。

  

  
  "ML3_FileType"子项的内容像下面这样:

  

  

        

  其中,Shell和Open下面的值是空的。因此,重要的属性有下面三个:
  1。文件类型描述,即"ML3_FileType"下的默认值"MyLog3 日志文件"。
  2。图标路径,即"DefaultIcon"下的默认值"F:桌面MyLog3ML3.ico"。
  3。启动参数,即"Command"下的默认值"F:桌面MyLog3MyLog3.exe "%1""。它是意思是,每当运行.ml3类型的文件,就会调用程序"F:桌面MyLog3MyLog3.exe",传递的命令行参数为""fileName"",fileName指的是这个ml3文件的完全路径。注意,路径用""包括了起来,这样,当文件名中有空格时不至于产生错误。(如:文件名为"F:ab  cd.ml3",如果不加"",则收到的命令行参数会是2个:F:ab和cd.ml3。)

  
  首先,需要一个类,用它来记录这些信息,看项目FileTypeReg里的类FileTypeRegInfo:
       



public class FileTypeRegInfo
    ...{
        /**//// 目标类型文件的扩展名
        public string ExtendName;  //".xcf"
        /**//// 目标文件类型说明
        public string Description; //"XCodeFactory项目文件"
        /**//// 目标类型文件关联的图标
        public string IcoPath;
        /**//// 打开目标类型文件的应用程序
        public string ExePath;
        public FileTypeRegInfo()
        ...{
        }
        public FileTypeRegInfo(string extendName)
        ...{
            this.ExtendName = extendName;
        }
    }

  

  其次,需要一个类,它实际上执行注册表的写入操作,看项目FileTypeReg里的类FileTypeRegister:
  



public class FileTypeRegister
    ...{
        //注册文件类型到系统中,需要传递FileTypeRegInfo对象       
        public static void RegisterFileType(FileTypeRegInfo regInfo)
        ...{
            //
        }
        //从系统中删除文件类型,需要传递后缀名,比如 .txt
        public static void DelFileTypeReg(string extendName)
        ...{
            //
        }        
        //返回相关的文件类型系统中的注册信息
        public static FileTypeRegInfo GetFileTypeRegInfo(string extendName)
        ...{
            //
        }        
        //更新文件类型信息
        public static bool UpdateFileTypeRegInfo(FileTypeRegInfo regInfo)
        ...{
            //
        }        
        //检查指定的文件类型是否已经注册过
        public static bool FileTypeRegistered(string extendName)
        ...{
            //
        }
    }

  

  增加注册RegisterFileType(FileTypeRegInfo regInfo):

       



public static void RegisterFileType(FileTypeRegInfo regInfo)
        ...{
            if (FileTypeRegistered(regInfo.ExtendName))
            ...{
                return;
            }

            //xcf_FileType
            string relationName = regInfo.ExtendName.Substring(1, regInfo.ExtendName.Length - 1).ToUpper() + "_FileType";

            //指定.xcf文件的关联信息在xcf_FileType中
            RegistryKey fileTypeKey = Registry.ClassesRoot.CreateSubKey(regInfo.ExtendName);//创建项.xcf
            fileTypeKey.SetValue("", relationName);//在.xcf 中增加一个默认值为 xcf_FileType
            fileTypeKey.Close();

            RegistryKey relationKey = Registry.ClassesRoot.CreateSubKey(relationName);//创建项xcf_FileType
            relationKey.SetValue("", regInfo.Description);//写入默认值文件类型说明

            RegistryKey iconKey = relationKey.CreateSubKey("DefaultIcon");//添加项,图标路径
            iconKey.SetValue("", regInfo.IcoPath);

            RegistryKey shellKey = relationKey.CreateSubKey("Shell");
            RegistryKey openKey = shellKey.CreateSubKey("Open");
            RegistryKey commandKey = openKey.CreateSubKey("Command");
            commandKey.SetValue("", regInfo.ExePath + " "%1"");   //让应用程序知道打开了哪个文件    

            relationKey.Close();
        }
  


  首先,判断是否已经注册过,如果已注册则退出。再得到存储信息的名relationName,并创建相应的子项DefaultIcon、Shell、Open、Command,写入相应的数据。这里涉及到注册表的操作,对其中的函数不明白的可以查看vs2005中的对象浏览器
  后面还有更新、删除等操作,其原理是一样的,对注册表中的值进行修改。

  在MyLog3项目中,实际执行文件类型注册的类是TSysRegeist:
  



public static void AddRegeist()//注册文件类型 .ml3
        ...{
            FileTypeRegInfo fileReg = new FileTypeRegInfo(".ml3");
            fileReg.Description = "MyLog3 日志文件";
            fileReg.ExePath = Application.StartupPath + @"MyLog3.exe";
            fileReg.IcoPath = Application.StartupPath + @"ML3.ico";

            if (FileTypeRegister.FileTypeRegistered(fileReg.ExtendName))
            ...{
                FileTypeRegister.UpdateFileTypeRegInfo(fileReg);
            }
            else
            ...{
                FileTypeRegister.RegisterFileType(fileReg);
            }
        }

        public static void DelRegeist()//从系统中删除文件类型.ml3的关联
        ...{
            FileTypeRegister.DelFileTypeReg(".ml3");
        }

 

  只要在应用程序启动后,调用相应的方法,就可以执行增加或删除的操作。

  下一篇,数据结构检查。
  ie.2008-04-08

 

 

 



本文来源:http://www.bbyears.com/banzhurengongzuo/13000.html

猜你感兴趣

热门标签

更多>>

本类排行