c# - DirectoryInfo 实例是否仍然可以在不同的 PC 上工作?

标签 c# serialization directoryinfo

如果您将 DirectoryInfo 实例从 PC1 发送到 PC2,GetFiles 或 GetDirectories 是否仍然有效?

public void DirTest()
    {
        //On first PC:

        DirectoryInfo driveC = new DirectoryInfo(@"C:\randomdir\");

        BinaryFormatter bf = new BinaryFormatter();
        MemoryStream ns = new MemoryStream();

        bf.Serialize(ns, driveC);
        SendStream(ns); //Sending the stream to the second PC


        //On second PC:


        ns = ReceiveStream(); //Receiving the stream from the first PC
        ns.Position = 0;
        DirectoryInfo di = (DirectoryInfo)bf.Deserialize(ns);

        //Does this work?
        foreach (FileInfo item in di.GetFiles())
        {
            Debug.WriteLine(item);
        }
    }

如果您在同一台 PC 上执行该代码,它可以工作,但我没有环境来测试这是否可以在 2 台不同的 PC 上工作。

也许子目录和文件保存在directoryinfo类的数组中,因为我发现了这个序列化函数: Serialization function in DirectoryInfo

最佳答案

嗯,只有当两台机器上有相同的目录名时它才有效。我们来看看reference source ...

首先,DirectoryInfo继承了FileSystemInfo,因此当你反序列化DirectoryInfo时,会调用这个构造函数:

    [System.Security.SecurityCritical]  // auto-generated
    private DirectoryInfo(SerializationInfo info, StreamingContext context) : base(info, context)
    {
        Directory.CheckPermissions(string.Empty, FullPath, checkHost: false);
        DisplayPath = GetDisplayName(OriginalPath, FullPath);
    }

其中 baseFileSystemInfo,并且使用此构造函数:

    [ResourceExposure(ResourceScope.None)]
    [ResourceConsumption(ResourceScope.Machine, ResourceScope.Machine)]
    protected FileSystemInfo(SerializationInfo info, StreamingContext context)
    {
        if (info == null)
            throw new ArgumentNullException("info");
        Contract.EndContractBlock();

        // Must use V1 field names here, since V1 didn't implement 
        // ISerializable.
        FullPath = Path.GetFullPathInternal(info.GetString("FullPath"));
        OriginalPath = info.GetString("OriginalPath");

        // Lazily initialize the file attributes.
        _dataInitialised = -1;
    }

因此您可以看到唯一被序列化的是 FullPathOriginalPath 值。目录内的数据未序列化,如果您调用 DirectoryInfo.GetFiles(),您将枚举本地计算机中的文件,而不是序列化目录中的 DirectoryInfo 的计算机。第一名。事实上,源代码明确指出延迟初始化文件属性,这意味着它们在请求时加载。

    // Returns an array of Files in the DirectoryInfo specified by path
    [ResourceExposure(ResourceScope.Machine)]
    [ResourceConsumption(ResourceScope.Machine)]
    public FileInfo[] GetFiles()
    {
        return InternalGetFiles("*", SearchOption.TopDirectoryOnly);
    }

哪个调用:

    // Returns an array of Files in the current DirectoryInfo matching the 
    // given search criteria (ie, "*.txt").
    [ResourceExposure(ResourceScope.Machine)]
    [ResourceConsumption(ResourceScope.Machine)]
    private FileInfo[] InternalGetFiles(String searchPattern, SearchOption searchOption)
    {
        Contract.Requires(searchPattern != null);
        Contract.Requires(searchOption == SearchOption.AllDirectories || searchOption == SearchOption.TopDirectoryOnly);

        IEnumerable<FileInfo> enble = FileSystemEnumerableFactory.CreateFileInfoIterator(FullPath, OriginalPath, searchPattern, searchOption);
        List<FileInfo> fileList = new List<FileInfo>(enble);
        return fileList.ToArray();
    }

再次,您会看到序列化信息中没有使用任何内容。

关于c# - DirectoryInfo 实例是否仍然可以在不同的 PC 上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50103203/

相关文章:

c# - 在事件链接时消除顺序依赖性和冗余的干净方法是什么?

java - Wicket 应用程序、序列化和 Java 计时器

python-3.x - 如何使用 ruamel.yaml 从 YAML 文件加载 Python lambda 表达式?

c# - 如何刷新 System.IO.DirectoryInfo.GetFiles().Length

C# 显示所选文件夹中的所有文件

c++ - 如何使用 C++ 获取路径的文件和目录列表?

c# - .NET 程序集内存使用

c# - 如何为 Visual Studio 使用的 IIS Express 添加 net.tcp 协议(protocol)支持?

c# - 将匹配多个批量输入的 LINQ 表达式

java - 如何只反序列化 JSON 中的某些字段?