您的位置:首页 > 理论基础 > 数据结构算法

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

2008-04-08 09:42 507 查看
  文件类型注册的可重用的类在项目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:/桌面/MyLog3/ML3.ico"。
  3。启动参数,即"Command"下的默认值"F:/桌面/MyLog3/MyLog3.exe "%1""。它是意思是,每当运行.ml3类型的文件,就会调用程序"F:/桌面/MyLog3/MyLog3.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

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息