Reputation: 1561
I have to check each xml file inside an array of different directories.
My code(still have errors):
string files = "C:\Hello; C:\Hi; D:\Goodmorning; D:\Goodafternoon; E:\Goodevening";
//Get each path and remove whitespaces
string[] paths = files.Split(new[] { ';', ' ' }, StringSplitOptions.RemoveEmptyEntries);
//Use xmlLoc for adding \ to each file
List<string> xmlLoc = new List<string>();
//get the files in directories
string[] getFiles;
//contains the files of each directory
List<string> xmlList
//Add \ each paths variable and store it in xmlLoc list
foreach (string s in paths)
{
xmlLoc.Add(s + @"\");
}
//get the xml files of each directory in xmlLoc and store it in xmlList
foreach (string file in xmlLoc)
{
getFiles = Directory.GetFiles(file, "*.xml");
//the code below lists an error "cannot convert from string[] to string"
xmlList.Add(getFiles);
}
I guess that you cannot store an array in a string list. Is the any other way how I can read the files in each directories stored in an array?
Upvotes: 1
Views: 905
Reputation: 4072
Try this, you need to initiliaze the XML list, and GetFiles returns an array, so you need to call AddRange, not Add when adding to the XML list.
string files = "C:\Hello; C:\Hi; D:\Goodmorning; D:\Goodafternoon; E:\Goodevening";
//Get each path and remove whitespaces
string[] paths = files.Split(new[] { ';', ' ' }, StringSplitOptions.RemoveEmptyEntries);
//Use xmlLoc for adding \ to each file
List<string> xmlLoc = new List<string>();
//get the files in directories
string[] getFiles;
//contains the files of each directory
List<string> xmlList = new List<string>();
//Add \ each paths variable and store it in xmlLoc list
foreach (string s in paths)
{
xmlLoc.Add(s + @"\");
}
//get the xml files of each directory in xmlLoc and store it in xmlList
foreach (string file in xmlLoc)
{
getFiles = Directory.GetFiles(file, "*.xml");
//the code below lists an error "cannot convert from string[] to string"
xmlList.AddRange(getFiles);
}
Upvotes: 0
Reputation: 166466
Have you tried using AddRange?
Something like
xmlList.AddRange(getFiles);
From what I can see, you could have also just gone with something like
List<string> xmlList = files.Split(new[] {';', ' '}, StringSplitOptions.RemoveEmptyEntries).
SelectMany(p => Directory.GetFiles(p, "*.xml")).
ToList();
Upvotes: 4
Reputation: 1561
Fixed it! Just have to add and replace some codes.. :)
string files = "C:\Hello; C:\Hi; D:\Goodmorning; D:\Goodafternoon; E:\Goodevening";
//Get each path and remove whitespaces
string[] paths = files.Split(new[] { ';', ' ' }, StringSplitOptions.RemoveEmptyEntries);
//Use xmlLoc for adding \ to each file
List<string> xmlLoc = new List<string>();
//get the files in directories
string[] getFiles;
//Add \ each paths variable and store it in xmlLoc list
foreach (string s in paths)
{
xmlLoc.Add(s + @"\");
}
//get the xml files of each directory in xmlLoc and loop it to read the files
foreach (string directory in xmlLoc)
{
getFiles = Directory.GetFiles(directory, "*.xml");
foreach(string files in getFiles)
{
MessageBox.Show(files);
}
}
Upvotes: 1
Reputation: 49270
It's not quite clear what you're trying to do, but you can use the AddRange
method to add all elements of the string[]
array returned by Directory.GetFiles
to your list at once:
string[] getFiles = Directory.GetFiles(file, "*.xml");
xmlList.AddRange(getFiles);
Also consider the following things:
Your xmlList
instance is not initialized, try:List<string> xmlList = new List<string>
();
The name of the variable file
in the foreach
construct is a misnomer, consider using directory
instead, since that is what the "elements" of xmlLoc
are.
You don't really need the getFiles
variable, a simple xmlList.AddRange(Directory.GetFiles(file, "*.xml"));
would be sufficient in your case.
Splitting on whitespace is not a good idea. Directory names (although not the examples you use), may contain whitespace themselves.
Your code looks a little to complicated. AFAICT the following would do the same:
string directories = /* ... whatever ... */;
List<string> xmlList = new List<string>();
foreach (string directory in string.Split(new[] {';'}, StringSplitOptions..RemoveEmptyEntries))
{
string dir = directory.Trim();
if (!dir.EndsWith(Path.DirectorySeparator))
dir += Path.DirectorySeparator;
xmlList.AddRange(Directory.GetFiles(dir, "*.xml"));
}
Upvotes: 2