【问题标题】:C# hierarchy of foldersC# 文件夹层次结构
【发布时间】:2018-03-28 18:03:48
【问题描述】:

我正在尝试做一些项目并坚持下去。我在做 Java 和 C++,没有 C#,但我得到了这个工作 - 创建并保存一个 XML 文件,其中包含指定驱动器上的完整文件夹层次结构,包括所有短文件的列表(短文件最多 8 个字符名称和扩展名最多 3 个字符)。我还需要以字节和字母为单位的文件和文件夹的大小,并打印具有小名称的文件(小于 11 个字符,包括扩展名)。这是我的代码:

using System;
using System.IO;
using System.Xml;
using System.Linq;


public class Program{
    public static void Main(string[] args)
    {
        //Your code goes here

string[] folders = {"Folder1", "Folder2"};
string[] files = {"File1.txt", "File2.txt"};
XmlTextWriter w1 = new XmlTextWriter("filesandfolders.xml",  System.Text.Encoding.UTF8);
w1.WriteStartElement("Folders");
Console.WriteLine(folders[0]);
Console.WriteLine(files[0]);
Console.WriteLine(folders[1]);
Console.WriteLine(files[1]);
w1.WriteEndElement();
w1.WriteEndDocument();

File.WriteAllText("filesandfolders.xml", "structure of folders and files");

long fileSize = 0;
int fileLegth = 0;
int NumberOfShortFiles;

Console.WriteLine("Folder names are: [{0}]", string.Join(", ", folders));
Console.WriteLine("File names are: [{0}]", string.Join(", ", files));

for(long p=0; p<=files.Length; p++){

Console.WriteLine("Size of this file is "+fileSize);
}

for(int q=0; q<=files.Length; q++){

Console.WriteLine("Directory length is "+q);
}

for(int m=0; m<=11; m++){
NumberOfShortFiles = m;
}

if(fileLegth<=11){
Console.WriteLine("File name is short.");
}
else{Console.WriteLine("File name is short or not evaluated.");}


        }
} 

我知道这个想法 - 制作文件和文件夹,我使用数组作为文件和另一个文件夹,希望知道如何将它们变成一个 XML,然后保存它并使用一些函数/循环来查看大小、打印它们等,但我很困惑,因为我之前从未见过这种编程语言。

让我说,现在的问题是我有以字节为单位的大小,但没有字母数,而且我缺少根元素(这是编译器所说的)。我没有使用序列化,所以我拿了一些我熟悉的东西(数组或列表)。

【问题讨论】:

  • 您似乎忘记发布问题/问题
  • 恕我直言,最好创建像public class File { /* fields describing the file */ } 这样的对象,然后派生文件夹类public class Folder : File { /* describe the folder */ List&lt;File&gt; _FilesInside; }。然后您可以使用 XmlSerializer 将其序列化为 XML。
  • @m.rogalski 虽然我同意你的观点,但我认为,对于刚开始的人来说可能太多了,甚至连自己代码的逻辑都丢失了。
  • @Prix 我认为他输的原因是因为所有这些代码都写在入口点中。但这只是我的意见。
  • @m.rogalski .NET 已经有代表文件和文件夹的类,它们是可序列化的。

标签: c# xml


【解决方案1】:

这种方法不是最有益的,因为如果文件夹中有文件,你会怎么做?在它旁边还有另一个文件夹和另一个文件?

|-- Folder1
|   |- File1
|   |- File2
|-- Folder2
|   |- File3
|   |- File4

从另一个角度考虑问题,您可能会使用名为 OOP - Object Oriented Programming 的东西,其中您有多个类,您将实例化为对象,并且对象将了解其他对象(例如,文件夹将了解内部的文件,反之亦然) .

感谢你,微软已经在 .NET 中创建了这个结构,它可以在命名空间 System.IO-link to MSDN 中找到。

对于最初的想法/方法,请查看https://msdn.microsoft.com/en-us/library/dd997370(v=vs.110).aspx,其中描述了如何浏览所有目录/文件并获取有关它们的信息。

一旦你有了这种类结构(文件/目录),就该转向序列化了。即使您对此不熟悉,.NET 也为大多数类提供了 XmlSerializer,您只需要创建自己的类,它将告诉 Serializer,“How to serialize my class”。

解决方案文字说明:

  • 创建新类(例如 FileTreeManager
  • 添加一些属性/变量持有Directories/Files
  • 实现接口 IXmlSerializable(类必须继承它,所以 XmlSerializer 知道如何序列化)

一些可使用的代码(缺少 XML 部分):

public class FileTreeManager
{
    private DirectoryInfo mDirectoryInfo;

    public FileTreeManager(string aEntryPoint)
    {
        SetEntryPoint(aEntryPoint);
    }

    public void SetEntryPoint(string aEntryPoint)
    {
        this.mDirectoryInfo = new DirectoryInfo(aEntryPoint);
    }

    public override string ToString()
    {
        StringBuilder result = new StringBuilder();
        foreach (DirectoryInfo dir in this.mDirectoryInfo.EnumerateDirectories())
        {
            result.Append("|-- " + dir.Name + Environment.NewLine);
        }
        return result.ToString();
    }
}

你的主要看起来像:

var ftm = new FileTreeManager("C:\\");
Console.WriteLine(ftm.ToString());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多