SQLDMO.SQLServer.EnumDirectories(string path)可以用来获取服务器端的文件夹目录信息,这在做远程备份时没有问题。
但是在还原时怎样能列举文件夹下面的文件,找到备份文件?不知有没有什么方法?

解决方案 »

  1.   

    文件可以用System.IO获得,干吗非要用sqldmo
      

  2.   

    C#中列举文件(Directory.GetFiles())的方法
      

  3.   

            #region DataTable GetServerDirectories(String ParentPath) // 取子目录
            /// <summary>
            /// 取子目录
            /// </summary>
            /// <param name="ParentPath">父附录</param>
            /// <returns>子目录</returns>
            DataTable GetServerDirectories(String ParentPath)
            {
                using (SqlConnection Connection = new SqlConnection(ConnectionString))
                {
                    SqlDataAdapter DataAdapter = new SqlDataAdapter("MASTER..XP_SUBDIRS '" + ParentPath + "'", Connection);
                    DataTable DT = new DataTable();
                    DataAdapter.Fill(DT);
                    return DT;
                }
            }
            #endregion        #region void EnumServerDirectories(TreeNode ParentNode) // 加载目录
            /// <summary>
            /// 加载目录
            /// </summary>
            /// <param name="ParentNode">父节点</param>
            void EnumServerDirectories(TreeNode ParentNode)
            {
                TvServerDirectories.SelectedNode = ParentNode;
                String DirectoryPath = ParentNode.Tag.ToString();
                if (ParentNode.Nodes.Count == 0)
                {
                    if (DirectoryPath.Substring(DirectoryPath.Length - 1) != "\\")
                        DirectoryPath += "\\";
                    try
                    {
                        foreach (DataRow DR in GetServerDirectories(DirectoryPath).Rows)
                        {
                            TreeNode TempNode = new TreeNode();
                            TempNode.Text = DR["subDirectory"].ToString();
                            TempNode.Tag = DirectoryPath + DR["subDirectory"].ToString() + "\\";
                            TempNode.ImageIndex = 3;
                            TempNode.SelectedImageIndex = 2;
                            TvServerDirectories.SelectedNode.Nodes.Add(TempNode);
                        }
                    }
                    catch (Exception)
                    {
                    }
                }
            }
            #endregion
      

  4.   


            #region void GetServerBackupFilesAndDiskFreeSpace() // 获取备份文件列表和磁盘剩余空间
            /// <summary>
            /// 获取备份文件列表和磁盘剩余空间
            /// </summary>
            /// <param name="Node">树节点</param>
            void GetServerBackupFilesAndDiskFreeSpace()
            {
                String Dir = TvServerDirectories.SelectedNode.Tag.ToString();
                // SlServerFreeSpace.Text = Consts.SERVICE_MONITOR_BACKUPRESTORE_FREESPACE(GetServerDriverFreeSpace // 还有bug
                //   (Dir.Substring(0, Dir.IndexOf(':') + 1))); 
                using (SqlConnection Connection = new SqlConnection(ConnectionString))
                {
                    SqlDataAdapter DataAdapter = new SqlDataAdapter("MASTER..XP_CMDSHELL 'DIR " + GetFormatLongDirectoryName(Dir) + "*."
                   + Consts.SERVICE_MONITOR_BACKUPRESTORE_BACKUP_DATAFILE_EXT + "'", Connection);
                    DataTable DT = new DataTable();
                    DataAdapter.Fill(DT);
                    foreach (DataRow DR in DT.Rows)
                    {
                        String Info = DR["output"].ToString();
                        int ExtIndex = Info.LastIndexOf("." + Consts.SERVICE_MONITOR_BACKUPRESTORE_BACKUP_DATAFILE_EXT);
                        if (ExtIndex >= 0)
                        {
                            int LastSpaceIndex = Info.LastIndexOf(" ");
                            EdtBackupFiles.Items.Add(Info.Substring(LastSpaceIndex).Trim());
                        }
                    }
                }
                MC.SlBackupFilesCount.Text = Consts.SERVICE_MONITOR_BACKUPRESTORE_BACKUP_FILECOUNT(EdtBackupFiles.Items.Count.ToString());
            }
            #endregion
      

  5.   

            #region String GetFormatLongDirectoryName(String LongDirectoryName) // 获取格式化长目录名
            /// <summary>
            /// 获取格式化长目录名
            /// </summary>
            /// <param name="LongFileName">长文件名</param>
            /// <returns>格式化长目录名</returns>
            String GetFormatLongDirectoryName(String LongDirectoryName)
            {
                String Path = LongDirectoryName;
                Path = Path.Replace("\\", "\"\\\"");
                Path = Path.Remove(Path.IndexOf('\"'), 1);
                Path = Path.Remove(Path.LastIndexOf('\"'), 1);
                return Path;
            }
            #endregion
      

  6.   

    哦,可能我没有说清楚:
    是要实现类似【SQL2005 Manager Studio】备份还原数据库时,在【定位数据库文件】这一步的效果。
    就是把服务器上的文件夹目录和文件用资源管理器的形式展现出来,可以自由选择备份地址和备份文件。现在只能看到服务器上的文件夹,看不到里面的文件,
    备份时当然没有问题,选择一个文件夹,给一个备份文件名,就可以实现备份。
    还原时就不行了,看不到以前的备份文件当然不能执行还原。
      

  7.   

    我楼上贴了,关键是利用sql的扩展存储过程
    MASTER..XP_CMDSHELL 'DIR 绝对目录'
    当然,为了安全因素,可能有的机子禁用要释放,删除了该存储过程的dll要回复,这也不是最好的办法
    只是比较省事点
      

  8.   


    谢谢wartim,这个可以实现。
    请问还有更好的方法么?
      

  9.   


    更好的?
    在服务器端写一个在用tcp监听请求和回发目录信息的windows服务,或者写成webservice
    wmi也许也可以,不过限制太多