Can't add files to listbox...READ - c#

I'm using a code to show all startup items in listbox with environment variable "%appdata%
There is some errors in this code that I need help with....
Check code for commented errors
Is there any other solution but still using %appdata%?
This is the code:
private void readfiles()
{
String startfolder = Environment.ExpandEnvironmentVariables("%appdata%") + "\\Microsoft\\Windows\\Start Menu\\Programs\\Startup";
foldertoread(startfolder);
}
private void foldertoread(string folderName)
{
FileInfo[] Files = folderName.GetFiles("*.txt"); // HERE is one error "Getfiles"
foreach (var file in Directory.GetFiles(folderName))
{
startupinfo.Items.Add(file.Name); // here is another error "Name"
}
}

This line won't work because folderName is a string (and does not have a GetFiles method):
FileInfo[] Files = folderName.GetFiles("*.txt");
The second error is occurring because the file variable is a string containing the filename. You don't need to call file.Name, just try the following:
startupinfo.Items.Add(file);

I don't think you need the following line:
FileInfo[] Files = folderName.GetFiles("*.txt");
The foreach loop will generate what you need.
Secondly, the file variable is a string, so rather than calling:
startupinfo.Items.Add(file.Name);
...call instead:
startupinfo.Items.Add(file);
Finally, instead of a var type for your loop, you can use a string, and you can specify the file type filter:
foreach (string fileName in Directory.GetFiles(folderName, "*.txt"))

The string object doesn't have a GetFiles() method. Try this:
string startfolder = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
string[] files = Directory.GetFiles(startfolder, "*.txt");
foreach (string file in files)
{
startupinfo.Items.Add(Path.GetFileNameWithoutExtension(file));
}
Path.GetFileNameWithoutExtension(file) returns just the file name instead of full path.

Related

Accessing files within child directories

I am trying to access the files in the images directory that lies within another directory but when I run my code it doesn't print out anything:
string path = #"C:\Path";
DirectoryInfo DFolder = new DirectoryInfo(path);
Collection cDetails = new Collection(DFolder);
string DFPath = DFolder.Name;
DirectoryInfo imDetails = new DirectoryInfo(imPath);
// Get Desired Directories
List<string> directoryFilter = new List<string> {"images", "videos", "RAW"};
List<DirectoryInfo> directoryList = DFolder
.GetDirectories("*", SearchOption.AllDirectories)
.Where(x => directoryFilter.Contains(x.Name.ToLower()))
.ToList();
string dpath = directoryList.ToString();
foreach (DirectoryInfo record in directoryList)
{
foreach (FileInfo file in record.GetFiles(#"*", SearchOption.TopDirectoryOnly))
{
Console.WriteLine(file); //It compiles but doesn't print anything on the console
}
}
Note: This isn't really an answer, so I'll delete it shortly, but wanted to give some sample code to test with in case it helps.
Your code works fine for me, so it seems that the problem is that either the directories don't exist, or they don't contain any files.
Here's a test program you can run which creates a bunch of directories under c:\temp, some of which have the names we care about. The names we care about are also found at different levels of depth in the path, yet they are all discovered:
static void CreateTestPathsAndFiles()
{
// Paths to create for testing. We will put a file in each directory below,
// but our search code should only print the file paths of those files that
// are directly contained in one of our specially-named folders
var testPaths = new List<string>
{
#"c:\temp\dummy1",
#"c:\temp\dummy1\raw", // This should print
#"c:\temp\dummy2",
#"c:\temp\dummy2\extra",
#"c:\temp\dummy3",
#"c:\temp\dummy3\dummy31",
#"c:\temp\dummy3\dummy32\raw", // This should print
#"c:\temp\extra",
#"c:\temp\images", // This should print
#"c:\temp\notUsed",
#"c:\temp\notUsed\videos", // This should print
#"c:\temp\raw", // This should print
#"c:\temp\videos\dummy1",
};
// Just something to make a unique file name
int fileId = 0;
// for testing, ensure that the directories exist and contain some files
foreach(var testPath in testPaths)
{
// Create the directory
Directory.CreateDirectory(testPath);
// Add a file to it
File.CreateText(Path.Combine(testPath, $"TempFile{fileId}.txt"))
.Write($"Dummy text in file {fileId}");
// Increment our file counter
fileId++;
}
}
static void Main(string[] args)
{
// Create our paths and files for testing
CreateTestPathsAndFiles();
// Now set our root directory, search for all folders matching our
// special folder names, and print out the files contained in them
var path = #"C:\Temp";
var directoryFilter = new List<string> {"images", "videos", "raw"};
// Get ALL sub-directories under 'path' whose name is in directoryFilter
var subDirectories = new DirectoryInfo(path)
.GetDirectories("*", SearchOption.AllDirectories)
.Where(x => directoryFilter.Contains(x.Name.ToLower()));
foreach (DirectoryInfo subDir in subDirectories)
{
foreach (FileInfo file in subDir.GetFiles(#"*", SearchOption.TopDirectoryOnly))
{
// We're using the FullName so we see the whole file path in the output
Console.WriteLine(file.FullName);
}
}
GetKeyFromUser("\nDone! Press any key to exit...");
}
Output
Note that the 5 files we expected to find are listed, but no others:
foreach (FileInfo file in record.GetFiles(#"*", SearchOption.TopDirectoryOnly))
{
Console.WriteLine(file); //It compiles but doesn't print anything on the console
}
SearchOption.TopDirectoryOnly will only search files in C://Path/images but not its subfolders.
a possible fix for this is to simply change your 2nd foreach loop to look like this:
foreach (FileInfo file in record.GetFiles(#"*", SearchOption.AllDirectories))
{
Console.WriteLine(file); //It compiles but doesn't print anything on the console
}
Edit:
Using SearchOption.AllDirectories as parameter is supposed to catch all cases of subfolders within your subfolder e.g. something like C://images//dir//somefile.txt instead of only taking the files within the topdirectory(in this case C://images). Which is(as i understood your question) exactly the kind of behaviour you were looking for.
Full code:
{
static void Main(string[] args)
{
// Directory Info
string path = #"C:\Path";
DirectoryInfo DFolder = new DirectoryInfo(path);
string DFPath = DFolder.Name;
// Get Desired Directories
List<string> directoryFilter = new List<string> { "images", "videos", "raw" };
List<DirectoryInfo> directoryList = DFolder.GetDirectories("*", SearchOption.AllDirectories).Where(x => directoryFilter.Contains(x.Name.ToLower())).ToList();
string dpath = directoryList.ToString();
foreach (DirectoryInfo record in directoryList)
{
foreach (FileInfo file in record.GetFiles(#"*", SearchOption.AllDirectories)) //searches directory record and its subdirectories
{
Console.WriteLine(file);
}
}
}
Final Edit: Sample output given the following structure:
C://Path//images//images.somefile.txt
C://Path//images//temp//images.temp.somefile.txt
C://Path//raw//raw.somefile.txt
C://Path//vidoes//videos.somefile.txt

delete a folder and its content

I just followed this tutorial to delete a folder and its content
public ActionResult Product_Delete()
{
string idnumber = "07";
string path1 = #"~/Content/Essential_Folder/attachments_AR/" + idnumber;
DirectoryInfo attachments_AR = new DirectoryInfo(Server.MapPath(path1));
EmptyFolder(attachments_AR);
Directory.Delete(path1);
....
}
private void EmptyFolder(DirectoryInfo directory)
{
foreach (FileInfo file in directory.GetFiles())
{
file.Delete();
}
foreach (DirectoryInfo subdirectory in directory.GetDirectories())
{
EmptyFolder(subdirectory);
subdirectory.Delete();
}
}
But using this its deleting all the contnet in 07 folder, but its not deleting the 07 folder finally.
I'm getting error in this line Directory.Delete(path1);
Once I debug I can see run time error with below message
Could not find a part of the path 'C:\Program Files (x86)\IIS
Express\~\Content\Essential_Folder\attachments_AR\07'.
but path1 value is ~/Content/Essential_Folder/attachments_AR/07
The reason is that Directory.Delete cannot recognize ~ in the path.
You need to convert it to an absolute path using Server.MapPath() like you did it here:
DirectoryInfo attachments_AR = new DirectoryInfo(Server.MapPath(path1));
You may also want to convert it once, and use in both methods:
public ActionResult Product_Delete()
{
string idnumber = "07";
string mappedPath1 = Server.MapPath(#"~/Content/Essential_Folder/attachments_AR/" + idnumber);
DirectoryInfo attachments_AR = new DirectoryInfo(mappedPath1));
EmptyFolder(attachments_AR);
Directory.Delete(mappedPath1);
....
}
By the way, there is absolutely no need to remove files manually. You can use
public ActionResult Product_Delete()
{
string idnumber = "07";
string mappedPath = Server.MapPath(#"~/Content/Essential_Folder/attachments_AR/" + idnumber);
Directory.Delete(mappedPath, true);
}
which will remove all folders, subfolders and files recursively, and then will remove directory itself.
you cannot delete a directory by giving its physical path. from a web application using Directory.Delete(), so you have to convert it into absolute path by using Server.MapPath()
Use : Directory.Delete(Server.MapPath(path1));
Or you can use Like the following without using EmptyFolder() method :
DirectoryInfo dir = new DirectoryInfo(Server.MapPath(path1));
dir.GetFiles("*", SearchOption.AllDirectories).ToList().ForEach(file=>file.Delete());
// will delete all files in the folder and its sub folder
//so you don't need to iterate each sub folder and files in it
Directory.Delete(Server.MapPath(path1));
you should delete the directly using full path instead of relative path. Try with
Directory.Delete(attachments_AR.FullName);
Just take separate path of the folder in variable and pass this variable in Directory.Delete(.) Like :
var path = Server.MapPath(#"~/Test");
DirectoryInfo attachments_AR = new DirectoryInfo(path);
Directory.Delete(path);
Why don't you use method from Directory class (MSDN documentation):
public static void Delete(
string path,
bool recursive
)
Your code will be cleaner and simplier but much more important is that when building path manually you can achive path long limit. I get issue like this and solution was use this method.
Here is a solution what I did and it is deleting the root folder too:
public ActionResult Product_Delete()
{
string idnumber = "07";
string path1 = #"~/Content/Essential_Folder/attachments_AR/" + idnumber;
DirectoryInfo attachments_AR = new DirectoryInfo(Server.MapPath(path1));
EmptyFolder(attachments_AR);
if (attachments_AR.Exists && IsDirectoryEmpty(attachments_AR.FullName))
attachments_AR.Delete();
}
private static void EmptyFolder(DirectoryInfo directory)
{
foreach (FileInfo file in directory.GetFiles())
{
file.Delete();
}
foreach (DirectoryInfo subdirectory in directory.GetDirectories())
{
EmptyFolder(subdirectory);
subdirectory.Delete();
}
}
public static bool IsDirectoryEmpty(string path)
{
return !Directory.EnumerateFileSystemEntries(path).Any();
}

How to get approximate file path?

I have a list file path as follow:
C:\Data\Default.aspx
C:\Data\Global.asax
C:\Data\Web.config
C:\Data\bin\PerlsComWebProject1.dll
C:\Data\bin\PerlsComWebProject1.pdb
I have a method to get file from folder path, however I want to print result as below:
Data\Default
Data\Global
Data\Web.config
Data\bin\PerlsComWebProject1
Data\bin\PerlsComWebProject1
Call: GetFilePathWithOutExtention(#"C:\\Data");
My code is only return file without an extension.
void GetFilePathWithOutExtention(string path)
{
string[] paths = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);
foreach(var path in paths)
{
Console.WriteLine(Path.GetFileNameWithoutExtension(path));
}
}
Update: Thanks for your comments. "C:\Data\" is only a sample, sorry so make you confused. Actual, I have a any folder, I want to search this folder, get approximate path: this folder...\filename with out extention.
Ex: I have a path as follow: D:\EHO\Phase1\Data\Document\text.txt,....when I call method: GetFilePathWithOutExtention("D:\EHO\Phase1"), I want to output: Phase1\Data\Document\text, or GetFilePathWithOutExtention("D:\EHO\Phase1\Data"), output: Data\Document\text.
Thanks.
I think what you're looking for is Uri.MakeRelativeUri
So you could do something like this:
var folder = new Uri(#"C:\Data");
var paths = System.IO.Directory.GetFiles(folder.LocalPath, "*.*", System.IO.SearchOption.AllDirectories);
foreach (var uri in paths.Select(p => new Uri(p)))
{
Console.WriteLine(folder.MakeRelativeUri(uri).ToString());
}
This prints
Data/Default.aspx
Data/Global.asax
Data/Web.config
Data/bin/PerlsComWebProject1.dll
Data/bin/PerlsComWebProject1.pdb
A generic answer, valid for all folders inside the machine drives, not only 1st level:
void GetFilePathWithOutExtention(string path)
{
// Get the name of the folder containing your path (for further remove in the items folder)
string parentFolderName = Directory.GetParent(path).FullName;
string[] filePaths = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);
foreach(string fileItemPath in filePaths)
{
// Get the current folder without the initial folder path
string currentItemPath = Path.GetDirectoryName(fileItemPath).Remove(0, parentFolderName.Length);
Console.WriteLine(Path.Combine(currentItemPath, Path.GetFileNameWithoutExtension(fileItemPath)));
}
}
you can just Show from the 4th char
void GetFilePathWithOutExtention(string path)
{
string[] filesName = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);
foreach(var fileName in filesName)
{
string pathToWrite = Path.GetFileNameWithoutExtension(fileName);
if(pathToWrite != null && pathToWrite.length >3 )
Console.WriteLine(pathToWrite.Substring(3,pathToWrite.length);
}
}

Efficient way to get the file list and copy to local directory?

I was trying to get the list of files in my remote directory and check only the file has name "test"; then copy to my local directory.
Just did a simple thing here but can someone please let me know the best way to handle this scenario.
class Program
{
static void Main(string[] args)
{
var getfiles = new fileshare.Program();
string[] filteredfiles =getfiles.GetFileList();
bool b;
foreach (string file in filteredfiles)
{
if(b=file.Contains("test"))
{
getfiles.copytolocal(file);
}
}
}
private string[] GetFileList()
{
string[] filepaths = Directory.GetFiles(#"\\testserver\dev");
return filepaths;
}
private void copytolocal(string filename)
{
File.Copy(filename, #"C:\" + filename);
}
}
Even i just stuck up when i was copy the file,the filename contains the whole directory inside the filename so filename look like "\\testserver\dev\test.txt". So it failed to copy in to local.
You can use DirectoryInfo to filter down to any file that contains the string "test":
private FileInfo[] GetFileList(string pattern)
{
var di = new DirectoryInfo(#"\\testserver\dev");
return di.GetFiles(pattern);
}
and then:
foreach (var file in GetFileList("*test*"))
{
getfiles.copytolocal(file.FullName);
}
You're looking for Path.GetFileName() (which returns a string).

Iterate through a root directory and get all files in it?

hi
i am creating a application and i want to know the each and every file which is present under that one folder .i.e. how can i iterate through a root directory and get the each files visit at list once.
If you just need to list them all at once, you can just use the overload for GetFiles that includes the option.
string[] filePaths = Directory.GetFiles(#"c:\MyDir\", "*.*", SearchOption.AllDirectories);
Obviously, in a web app you wouldn't likely have access to "c:\MyDir", so you can replace that with a variable holding the results of a MapPath call like so:
var rootDir = Server.MapPath("~/App_Data");
Use the Directory.EnumerateFiles(String, String, SearchOption) function with SearchOption.AllDirectories:
foreach (var file in Directory.EnumerateFiles(#"c:\", "*.txt", SearchOption.AllDirectories))
{
// Do stuff here
}
EnumerateFiles method is way faster than GetFiles method since it actually just returns the enumerator and does not actually access the files until they are red.
You can use the DirectoryInfo and FileInfo classes as well as a recursive function.
void Main()
{
DirectoryInfo info = new DirectoryInfo(#"C:\Personal");
ListContents(info);
}
public void ListContents(DirectoryInfo info)
{
foreach(var dir in info.GetDirectories())
{
ListContents(dir);
}
foreach(var file in info.GetFiles())
{
Console.WriteLine(file.FullName);
}
}

Categories