如何在Visual Studio(Windows Forms)中创建与管理符号链接
Windows Forms实现共享文件夹符号链接挂载/卸载功能问题
我是Visual Studio 2022 Community版新手,正在用C#开发Windows Forms应用,需要根据符号链接的挂载/卸载状态,执行对应的挂载或卸载操作。已添加System.IO命名空间,需求对应的批处理逻辑如下:
set dest=\\path\to\share\pub set dest="%dest%" for %%i in (%dest%) do (set "fold=%%~ni") if exist "c:\VOLUMES\%fold%" (goto:unmount) else (goto:mount) :unmount RD "c:\VOLUMES\%fold%" net use %dest% /delete pause goto:eof :mount if not exist "C:\Volumes" MD "C:\Volumes" mklink /d "c:\VOLUMES\%fold%" "%dest%" net use %dest% pause goto:eof
目前遇到几个问题:
1. 无法提取目标路径的最终文件夹名称
在列表框选择项变更事件中,能获取完整路径,但尝试提取最后一级文件夹名称时失败,代码如下:
private void ChangeLinkListBox(object sender, EventArgs e) { // 能正常获取完整路径字符串 SymLinkSelect.Text = SymLinkList.SelectedItem.ToString(); // 尝试提取最后一级文件夹名称的方法都无效 //SymLinkFolder.Text = SymLinkList.SelectedItem.Path(); //SymLinkFolder.Text = SymLinkList.SelectedItem.ToPath(); //SymLinkFolder.Text = SymLinkList.SelectedItem.ToString(); //SymLinkFolder.Text = new DirectoryInfo(SymLinkList.SelectedItem.ToString()).Name; }
2. 挂载/卸载按钮的逻辑无法实现
已经做了一个按钮,希望点击时对列表选中的路径执行挂载或卸载操作,但不知道如何实现具体逻辑,代码框架如下:
private void MountShare(object sender, EventArgs e) // 在此处实现挂载/卸载逻辑,需要检查挂载状态? { if (btnPos == false) { if (SymLinkSelect.Text.Length > 0) { btnPos = true; // 挂载逻辑写在这里 // DoProcess("Net") - 当前上下文不存在该方法 // 要不要把参数传给批处理文件执行? btnMount.Text = "Unmount"; } else { MessageBox.Show("Select a Link to Mount please", "SymLink Says: "); } } else { btnMount.Text = "Mount"; // 卸载逻辑写在这里 btnPos = false; } }
3. 集成CreateSymbolicLink的DllImport代码报错
找到一段用kernel32.dll创建符号链接的代码,但尝试集成到自己的Form类中时,哪怕只添加[DllImport("kernel32.dll")]都会报错,这段参考代码如下:
namespace ConsoleApplication { class Program { [DllImport("kernel32.dll")] static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, SymbolicLink dwFlags); enum SymbolicLink { File = 0, Directory = 1 } static void Main(string[] args) { string symbolicLink = @"c:\bar.txt"; string fileName = @"c:\temp\foo.txt"; using (var writer = File.CreateText(fileName)) { writer.WriteLine("Hello World"); } CreateSymbolicLink(symbolicLink, fileName, SymbolicLink.File); } } }
附上当前应用界面截图:
内容的提问来源于stack exchange,提问作者roar
相关产品推荐
相关产品推荐

