在做远程数据库还原时,怎样列举服务器上的文件? SQLDMO.SQLServer.EnumDirectories(string path)可以用来获取服务器端的文件夹目录信息,这在做远程备份时没有问题。但是在还原时怎样能列举文件夹下面的文件,找到备份文件?不知有没有什么方法? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 文件可以用System.IO获得,干吗非要用sqldmo C#中列举文件(Directory.GetFiles())的方法 #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 #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 #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 哦,可能我没有说清楚:是要实现类似【SQL2005 Manager Studio】备份还原数据库时,在【定位数据库文件】这一步的效果。就是把服务器上的文件夹目录和文件用资源管理器的形式展现出来,可以自由选择备份地址和备份文件。现在只能看到服务器上的文件夹,看不到里面的文件,备份时当然没有问题,选择一个文件夹,给一个备份文件名,就可以实现备份。还原时就不行了,看不到以前的备份文件当然不能执行还原。 我楼上贴了,关键是利用sql的扩展存储过程MASTER..XP_CMDSHELL 'DIR 绝对目录'当然,为了安全因素,可能有的机子禁用要释放,删除了该存储过程的dll要回复,这也不是最好的办法只是比较省事点 谢谢wartim,这个可以实现。请问还有更好的方法么? 更好的?在服务器端写一个在用tcp监听请求和回发目录信息的windows服务,或者写成webservicewmi也许也可以,不过限制太多 怎么每次只准一个timer进程运行? 如何记用户自己修改水晶报表 datagridview控件 数据重复显示 线程同步上下文问题 寻找最优字符替换方案 Com+程序集强名称怎么打的! 哪里有。net2005下载 vs2005 beta1 中怎么为webform添加事件处理 Winfrom窗口中显示网页的问题(关键字:IE11,百度地图) 菜鸟问题: label换个地方就不显示了? 类里面数组的问题
/// <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
#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
/// <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
是要实现类似【SQL2005 Manager Studio】备份还原数据库时,在【定位数据库文件】这一步的效果。
就是把服务器上的文件夹目录和文件用资源管理器的形式展现出来,可以自由选择备份地址和备份文件。现在只能看到服务器上的文件夹,看不到里面的文件,
备份时当然没有问题,选择一个文件夹,给一个备份文件名,就可以实现备份。
还原时就不行了,看不到以前的备份文件当然不能执行还原。
MASTER..XP_CMDSHELL 'DIR 绝对目录'
当然,为了安全因素,可能有的机子禁用要释放,删除了该存储过程的dll要回复,这也不是最好的办法
只是比较省事点
谢谢wartim,这个可以实现。
请问还有更好的方法么?
更好的?
在服务器端写一个在用tcp监听请求和回发目录信息的windows服务,或者写成webservice
wmi也许也可以,不过限制太多