1

I am trying to do some project and get stuck with it. I was doing Java and C++, no C#, but I got this to work on - create and save an XML file containing complete hierarchy of folders on a specified drive including a list of all files that are short (short file has up to 8 characters for name and up to 3 characters for extension). I also need to have size of file and folder in bytes and in letters and print files with small name (smaller then 11 char including extension). This is my code:

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.");}


        }
} 

I know the idea - make files and folders, I used array for files and another for folders hoping to know how to make them to be one XML, then save it and use some functions/loops to see size, print them etc, but I am quite confused since I never saw this kind of programming language earlier.

Let me say that for now problem is that I have size in bytes, but don't have number of letters, and I am missing root element (that is what compiler said). I didn't work with serialization, so I took something that I am familiar with (array or list).

Ana
  • 29
  • 6
  • 3
    You seem to have forgotten to post the question/problem – BugFinder Nov 24 '16 at 11:36
  • 1
    IMHO it would be better to create object like `public class File { /* fields describing the file */ }` and then derive Folder class `public class Folder : File { /* describe the folder */ List _FilesInside; }`. Then you could just serialize it to XML using **XmlSerializer**. – mrogal.ski Nov 24 '16 at 11:43
  • @m.rogalski while I do agree with you, I think, it might be too much for some one just starting, which seems to be lost with even the logic of its own code. – Prix Nov 24 '16 at 11:45
  • @Prix I think the reason why is he lost is due to the fact that all of this code is written in entry point. But that's only my opinion. – mrogal.ski Nov 24 '16 at 11:51
  • @m.rogalski .NET already has classes that represent files and folders, and they are serializable. – BartoszKP Nov 24 '16 at 12:25

1 Answers1

2

This approach is not the most beneficial one, because what will You do if You have File inside a folder? And next to it there is other folder with another file?

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

Taking the problem from other side, You might use something called OOP - Object Oriented Programming, where You have several classes, You will instanciated into objects and the objects will know about other objects (e.g. Folders will know about Files inside and vica versa).

Thankfuly for You, Microsoft has already created this structure in .NET, it can be found in namespace System.IO- link to MSDN.

For original idea/approach, have a look at https://msdn.microsoft.com/en-us/library/dd997370(v=vs.110).aspx , where is described how to go through all the directiories/files & get info about them.

Once You have this structure of classes (Files/Directories), it is time to move to Serialization. Even You are unfamiliar with this, .NET provides XmlSerializer for most of classes and You just need to create Your own class, which will tell the Serializer, "How to serialize my class".

Text description of solution:

  • Create new class (e.g. FileTreeManager)
  • add some properties/variables holding Directories/Files
  • implement interface IXmlSerializable (class have to inherit this so XmlSerializer knows how to serialize)

Some code to work with (missing XML part):

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();
    }
}

Your main would look like:

var ftm = new FileTreeManager("C:\\");
Console.WriteLine(ftm.ToString());
Tatranskymedved
  • 4,194
  • 3
  • 21
  • 47