跨PC传输DirectoryInfo实例后,GetFiles等方法能否正常工作?
关于跨机器传输DirectoryInfo实例的问题解答
先来看你提出的两个核心问题,以及对应的示例代码:
- DirectoryInfo实例在另一台计算机上是否仍可正常工作?
- 若将PC1上的DirectoryInfo实例传输至PC2,调用GetFiles或GetDirectories方法是否仍能正常运行?
附示例代码:
public void DirTest() { //在第一台电脑上: DirectoryInfo driveC = new DirectoryInfo(@"C:\randomdir\"); BinaryFormatter bf = new BinaryFormatter(); MemoryStream ns = new MemoryStream(); bf.Serialize(ns, driveC); SendStream(ns); //将流发送至第二台电脑 //在第二台电脑上: ns = ReceiveStream(); //接收来自第一台电脑的流 ns.Position = 0; DirectoryInfo di = (DirectoryInfo)bf.Deserialize(ns); }
1. DirectoryInfo实例在另一台计算机上是否仍可正常工作?
答案是不行。DirectoryInfo是.NET专门用来和本地文件系统交互的类,它的所有属性和方法都依赖于创建它的那台机器的文件系统环境。当你把它序列化传输到另一台电脑后,这个实例保存的还是原机器的目录路径(比如示例里的C:\randomdir\),而目标机器的文件系统大概率和原机器不匹配:要么路径不存在,要么路径对应的目录内容、权限完全不同。此时这个实例的大部分属性(比如Exists)都会返回错误的结果,基本失去了实用价值。
2. 调用GetFiles或GetDirectories方法是否仍能正常运行?
同样无法正常达到你的预期,甚至会直接抛出异常:
- 如果PC2上没有
C:\randomdir\这个目录,调用这些方法会立刻抛出DirectoryNotFoundException; - 就算PC2上碰巧有同名目录,返回的也是PC2本地该目录下的文件/子目录,和PC1上的目标目录完全无关;
- 另外,还可能遇到权限问题:PC2的当前运行用户如果没有访问该目录的权限,会抛出
UnauthorizedAccessException。
问题根源:DirectoryInfo不是用来传输的对象
你用BinaryFormatter序列化DirectoryInfo的方式,本质上只是把这个对象的基础元数据(比如路径字符串)传过去了,而不是目录的实际内容。DirectoryInfo本身并不存储目录里的文件列表,它只是一个“本地文件系统的访问工具”——离开了它创建时的本地环境,这个工具就没有作用了。
正确的做法
如果你的需求是要在PC2上获取PC1某目录的内容,应该:
- 在PC1上主动调用
GetFiles()/GetDirectories(),获取文件/目录的详细信息(比如路径、大小、创建时间等); - 把这些信息封装成一个自定义的可序列化对象(比如一个包含文件路径列表的DTO),或者直接序列化字符串列表;
- 将这个序列化后的数据流传输到PC2;
- 在PC2上反序列化后,直接处理这些传输过来的内容,而不是依赖
DirectoryInfo实例。
内容的提问来源于stack exchange,提问作者SinOfficial
相关产品推荐
相关产品推荐

