DirectoryInfo d = new DirectoryInfo(mypath);//Assuming Test is your Folder
FileInfo[] Files = d.GetFiles("*.jpg"); //Getting Text files
How the files array could be order by name?
let's say
files[0].Name is 'hi1.jpg'
files[1].Name is 'hi2.jpg'
and so on
It is just a call to OrderBy in Linq namespace
using System.Linq;
....
FileInfo[] Files = d.GetFiles("*.jpg").OrderBy(x => x.Name).ToArray();
By the way, I suggest you to use EnumerateFiles instead of GetFiles. In particular if you have to loop over the result like this
foreach(FileInfo fi in d.EnumerateFiles("*.jpg").OrderBy(x => x.Name))
Console.WriteLine(fi.Name);
As explained in the MSDN documentation
The EnumerateFiles and GetFiles methods differ as follows: When you
use EnumerateFiles, you can start enumerating the collection of
FileInfo objects before the whole collection is returned. When you
use GetFiles, you must wait for the whole array of FileInfo objects to
be returned before you can access the array.
FileInfo[] Files = d.GetFiles("*.jpg").OrderBy(f => f.Name).ToArray();
Using Linq
d.GetFiles("*.jpg").OrderBy(file=> file.Name).ToArray();
FileInfo[] files = d.GetFiles("*.jpg").OrderBy(file => file.Name).ToArray();
As answered above .ToArray() function along with OrderBy(columnName) does the job.
Related
FileInfo[] comList = new FileInfo[]{};
FileInfo[] files
DirectoryInfo dInfo;
string[] folderList = path.Split(',');
foreach (string folder in folderList){
dInfo = new DirectoryInfo(folder);
files = dInfo.GetFiles().Where(F => extensions.Contains(f.Extension.ToLower())).ToArray();
comList.Concat(files);
}
I am trying to read multiple folders and get all the files into one FileInfo[], but after doing the concat to comList, my comList is still empty.
the path input is something like string path = "pathA,pathB,pathC"
if this is not the way to do it, what is a better ways to get all the files from different directory into one.
According to Microsoft documentation Concat will returns a new collection without modifying existing one:
public static System.Collections.Generic.IEnumerable<TSource> Concat<TSource> (
this System.Collections.Generic.IEnumerable<TSource> first,
System.Collections.Generic.IEnumerable<TSource> second);
Therefore in your scenario assigning the statement back to comList as following and you're good to go!
comList = comList.Concat(files);
Nonetheless, if you're not constraining yourself to use array for comList, you may consider to use List instead which allow us to achieve the same without redundant cast:
List<FileInfo> comList = new List<FileInfo>();
...
foreach (string folder in folderList) {
var dInfo = new DirectoryInfo(folder);
var files = dInfo.GetFiles().Where(f =>
extensions.Contains(
f.Extension.ToLower()));
comList.AddRange(files);
}
You need to use the return of comList.Concat(files), like:
comList = comList.Concat(files).ToArray();
The ToArray() method is needed because Concat() returns an IEnumerable.
Alternatively you can make comList an actual List<FileInfo> and use its AddRange method in each iteration:
comList.AddRange(files);
I have a OpenFileDialog and I want to convert selected file names to a FileInfo[] variable.
But I don't know how to convert all the selected files in one line code.
This obviously doesn't work:
FileInfo[] files = openFileDialog.FileNames;
Thank you.
Using LINQ:
FileInfo[] files = openFileDialog.FileNames.Select(f => new FileInfo(f)).ToArray();
The FileInfo class offers a constructor that expects a filename. Therefore, to get a FileInfo instance for a single filename string, simply call that constructor:
FileInfo file = new FileInfo(openFileDialog.FileName);
In your case, you want to get an array and have several filename strings, therefore you can use the LINQ extension methods from the Enumerable class:
FileInfo[] files = openFileDialog.FileNames.Select(fn => new FileInfo(fn)).ToArray();
Note the additional call to ToArray in the end, as Select will return an IEnumerable<FileInfo>.
I have list if files names(not paths) in a List<string>. I have to find a List<string> of files that are NOT present in a directory.
Right now I am iterating the files one by one and checking each one of them to all files in the folder.
Is there any LINQ way of achiving the same thing ?
You can use Enumerable.Except like:
List<string> compareList = new List<string>();
//.... items in the list
DirectoryInfo di = new DirectoryInfo("C:\\");
var fileArray = di.GetFiles().Select(r => r.Name).ToArray();
var filesNotPresent = compareList.Except(fileArray);
Depending on how many names you have in your list (and how many files are in the destination), you may find that the iterative approach is still the most efficient (but with some LINQ enhancements):
var missingFiles = names.Where(x => !File.Exists(x));
I am trying to extract a list of files within a folder and am currently using:
string[] files = Directory.GetFiles(txtbxNewFolder.Text);
But that returns things like "C:\Users\Dahlia\Desktop\New Folder\jerry.txt". Is there a way to return only "jerry.txt", or do I need to do some sort of split on the array strings?
I am also trying to return a list of folders within a directory and am currently using:
string[] folders = Directory.GetDirectories(txtbxOldFolder.Text);
But that returns things like "C:\Users\Dahlia\Desktop\New Folder\folder1". Is there a way to return only "folder1", or do I need to do some sort of split on the array strings?
Using LINQ you can get a list of just the files:
Directory.GetFiles(txtbxNewFolder.Text).Select(f => Path.GetFileName(f));
Though rather than GetFiles I'd probably use:
Directory.EnumerateFiles(txtbxNewFolder.Text).Select(f => Path.GetFileName(f));
It isn't as simple to get the directory name, but this should work (untested):
Directory.GetDirectories(txtbxOldFolder.Text)
.Select(d => new DirectoryInfo(d).Name);
Similarly, there is a:
Directory.EnumerateDirectories(txtbxOldFolder.Text)
.Select(d => new DirectoryInfo(d).Name);
You could use Path.GetFileName and LINQ
e.g.:
string[] files = Directory.GetFiles(txtbxNewFolder.Text)
.Select(f => Path.GetFileName(s))
.ToArray();
Have a look at the FileInfo and DirectoryInfo classes.
You can do:
foreach (String file in files) {
var fi = new FileInfo(file);
Console.Out.WriteLine(fi.Name);
}
Similar for DirectoryInfo.
Hi i'm a c# begginer and i'd like to do a simple program which is going to go through a folder and count how many files are .mp3 files and how many are .flac .
Like I said the program is very basic. It will ask for the music folder path and will then go through it. I know there will be a lot of subfolders in that main music folder so it will have to open them one at the time and go through them too.
E.g
C:/Music/
will be the given directory.
But it doesn't contain any music in itself.
To get to the music files the program would have to open subfolders like
C:/Music/Electronic/deadmau5/RandomAlbumTitle/
Only then he can count the .mp3 files and .flac files and store them in two separated counters.
The program will have to do that for at least 2000 folders.
Do you know a good way or method to go through files and return its name (and extension)?
You can use System.IO.DirectoryInfo. DirectoryInfo provides a GetFiles method, which also has a recursive option, so if you're not worried about speed, you can do this:
DirectoryInfo di = new DirectoryInfo(#"C:\Music");
int numMP3 = di.GetFiles("*.mp3", SearchOption.AllDirectories).Length;
int numFLAC = di.GetFiles("*.flac", SearchOption.AllDirectories).Length;
Use DirectoryInfo and a grouping by the file extension:
var di = new DirectoryInfo(#"C:/Music/");
var extensionCounts = di.EnumerateFiles("*.*", SearchOption.AllDirectories)
.GroupBy(x => x.Extension)
.Select(g => new { Extension = g.Key, Count = g.Count() })
.ToList();
foreach (var group in extensionCounts)
{
Console.WriteLine("There are {0} files with extension {1}", group.Count,
group.Extension);
}
C# has a built in method of searching for files in all sub-directories. Make sure you add a using statement for System.IO
var path = "C:/Music/"
var files = Directory.GetFiles(path, "*.mp3", SearchOption.AllDirectories);
var count = files.Length;
Since you're a beginner you should hold off on the more flexible LINQ method until later.
int fileCount = Directory.GetFiles(_Path, "*.*", SearchOption.TopDirectoryOnly).Length
Duplicate question How to read File names recursively from subfolder using LINQ
Jon Skeet answered there with
You don't need to use LINQ to do this - it's built into the framework:
string[] files = Directory.GetFiles(directory, "*.dll",
SearchOption.AllDirectories);
or if you're using .NET 4:
IEnumerable<string> files = Directory.EnumerateFiles(directory, "*.dll",
SearchOption.AllDirectories);
To be honest, LINQ isn't great in terms of recursion. You'd probably want to write your own general-purpose recursive extension method. Given how often this sort of question is asked, I should really do that myself some time...
Here is MSDN support page, How to recursively search directories by Visual C#
Taken directly from that page:
void DirSearch(string sDir)
{
try
{
foreach (string d in Directory.GetDirectories(sDir))
{
foreach (string f in Directory.GetFiles(d, txtFile.Text))
{
lstFilesFound.Items.Add(f);
}
DirSearch(d);
}
}
catch (System.Exception excpt)
{
Console.WriteLine(excpt.Message);
}
}
You can use this code in addition to creating FileInfo objects. Once you have the file info objects you can check the Extension property to see if it matches the ones you care about.
MSDN has lots of information and examples, for example how you can iterate through a directory: http://msdn.microsoft.com/en-us/library/bb513869.aspx