I have the following code:
if (!Directory.Exists(#"C:\" + reader1.GetString(ColIndex1) + #"\" + reader1.GetString(ColIndex2) + #"\" + reader1.GetString(ColIndex3)))
{
Directory.CreateDirectory(#"C:\" + reader1.GetString(ColIndex1) + #"\" + reader1.GetString(ColIndex2) + #"\" + reader1.GetString(ColIndex3));
}
How do I escape the values so it can correctly check if folders exist and create them if needed?
For example, at the moment, if ColIndex2 contains text which includes the following characters:
\/:*?"<>|
The code does not create the folders properly.
You don't need to check if subdirectories exist . Directory.CreateDirectory will create all subdirectories that you need. For more information check the documentation here.
Creates all directories and subdirectories in the specified path.
Moreover instead of concatening your strings with #"\", the safer way is to use Path.Combine. E.g :
String yourFullPath = Path.Combine(
#"C:\",
reader1.GetString(ColIndex1),
reader1.GetString(ColIndex2),
reader1.GetString(ColIndex3));
// following will do nothing if yourFullPath already exists
Directory.CreateDirectory(yourFullPath) ;
Finally, I've tried this sample with a / character :
System.IO.Directory.CreateDirectory(System.IO.Path.Combine(#"c:\", #"a/b\c")) ;
And it's creating all the folders a, b and c.
EDIT
If you want to removeInvalidcharPath. Path.GetInvalidFileNameChars() will help you to do so :
char [] allInvalidChars = Path.GetInvalidFileNameChars();
string yourPathWithoutInvalidChars = new string(yourFullPath.ToCharArray().Where(c => !allInvalidChars.Contains(c)).ToArray());
Related
i have the following piece of code:
string fFileName = #txtSelectedFolder.Text + "\\" + file.Name;
txtSelectedFolder.text contains nothing more than a path to a folder (for example: c:\temp\test)
file.name is a FileInfo type where name contains a reference to the current selected file in a collection of Files.
As soon as i use the above code, my fFileName var is filled with an escaped string like c:\\temp\\test\filename.ext
How can i make sure that fFileName contains the unescaped version of the filefolder (and name)
You aren't using a literal when adding in the extra wacks (\) . This will mean your string will escape the \ as it's being compiled and leave you with a single wack.
Alter your line:
string fFileName = #txtSelectedFolder.Text + "\\" + file.Name;
to
string fFileName = txtSelectedFolder.Text + #"\" + file.Name;
You don't need the # literal symbol infront of your variable.
Alternatively:
You can instead use
string fFileName = Path.Combine(txtSelectedFolder.Text, file.Name);
to properly concatenate the file's name to the selected file's path.
You could also use Uri.UnescapeDataString if using .net 5 or older
Read more about it here, example below:
var unescapedPath = Uri.UnescapeDataString("\\\\server\\dir1\\dir2");
Console.WriteLine(unescapedPath);
// \\server\dir1\dir2
public void CreateCertificate()
{
File.Create($"
{#"C:\Users\Director\Documents\TestCertApp\TestSub\" + thisYear +
" Certificates- " + certType + "\""}{myFileName}.ppt", 1 ,
FileOptions.None);
}
So I need the backslash between certype and filename to show it belongs within the folder and not next to. It says its an illegal character but how would I get the file in the folder without it?
Based on the code that you wrote the file path that will be generated is (based on my own substitutions for the variables):
String thisYear = "2019";
String certType = "UnderGrad";
String myFileName = "myfile";
String fileToCreate = $"{#"C:\Users\Director\Documents\TestCertApp\TestSub\" + thisYear + " Certificates- " + certType + "\""}{myFileName}.ppt";
Debug.Print(fileToCreate);
Will give you this output:
C:\Users\Director\Documents\TestCertApp\TestSub\2019 Certificates- UnderGrad"myfile.ppt
If you notice there is a " before the filename part of myfile.ppt - This is where the Illegal Character comes from.
If you use this code fragment to generate the path:
String basePath = #"C:\Users\Director\Documents\TestCertApp\TestSub\";
String certificateFolder = $"{thisYear} Certificates- {certType}";
String correctFilePath = Path.Combine(basePath, certificateFolder, $"{myFileName}.ppt");
Debug.Print(correctFilePath);
This will result in the output of:
C:\Users\Director\Documents\TestCertApp\TestSub\2019 Certificates- UnderGrad\myfile.ppt
This version has a \ where the previous code had a " and is no longer illegal, but conforms to the requirement that you wrote the files being in the folder.
Something else to note:
You may want to use Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); to get the path to the MyDocuments folder of the user.
Well, the short answer is that you cannot use an illegal character in a path or file name. Otherwise it wouldn't be illegal. :)
But it seems that the problem here is that you though you were adding a backslash (\) character, when really you were adding a double quote (") character. So if everything else is ok, you can just replace "\"" with "\\" and it should work.
Part of the problem is also that you're doing some strange combination of string interpolation, and it makes the code really hard to read.
Instead you can use just string interpolation to simplify your string (I had to use concatenation below to prevent horizontal scrolling, but you could remove it):
string filePath = $#"C:\Users\Director\Documents\TestCertApp\TestSub\{thisYear} " +
$#"Certificates- {certType}\{myFileName}.ppt";
But even better would be to use the Path.Combine method, along with some variables, to make the intent very clear:
var rootDir = #"C:\Users\Director\Documents\TestCertApp\TestSub"
var fileDir = $"{thisYear} Certificates- {certType}"
var fileName = "{myFileName}.ppt";
var filePath = Path.Combine(rootDir, fileDir, fileName);
I am trying to pass a filepath to xcopy command for copying a folder from one location to another( CodedUI using C#).
While doing the same the problems is, I am trying to add double quotes around the path but it's not taking the correct path format.
Code:
string Path = "Some path to folder location";
// Tried all these solutions
Path = '\"' + Path + '\"';
Path = '\"' + Path + '\"';
Path = string.Format("\"{0}\"", Path );
Expected: ""Some path to folder location""
Actual:"\"Some path to folder location"\"
Please help.
In debugger you will see the backslash.
Sent your output to Console and you will see the result is good.
string Path = "Some path to folder location";
Path = "\"" + Path + "\"";
Console.WriteLine(Path);
From what i understand, you want to see
"Some path to folder location"
when you print it. If so, do:
string path = "\"Some path to folder location\"";
or
string path = "Some path to folder location";
var finalString = string.Format("\"{0}\"", path);
Maybe you should try verbatim strings like #"the\path\to\another\location".
This is the best way to write paths without having to struggle with escape codes.
EDIT:
You can use double quotes in a verbatim string:
#"""the\path\to\another\location"""
If you're trying to preserve two sets of double quotes, try building the string like so:
var path = "hello";
var doubleQuotes = "\"\"";
var sb = new StringBuilder(doubleQuotes)
.Append(path)
.Append(doubleQuotes);
Console.WriteLine(sb.ToString()); // ""hello""
Of course, if you want single quotes you simply swap doubleQuotes for singleQuotes = "\""; and get "hello".
To add double quote, you need to add '\' before ' " '.
Note that : if you are having '\' in path, you have to take care of it like below.
if path is "D:\AmitFolder"
string path = #"D:\AmitFolder";
//Or
path = "D:\\AmitFolder"
string str = "\"" + path + "\"";
Console.WriteLine(str);
here str will be "Some path to folder location"
Output:
as in above line we are adding "\"" string as prefix and "\"" as post fix of the main string.
While storing string values if any double quotes are to be added they need to be escaped using backshlash(\). Single quotes are used for character data. The following code should get the output needed.
Path = string.Format("\"{0}\"", Path);
Also I have created a small fiddle here.
I have an application that needs to return the names of subdirectories in a specific path. However, the path can include a variable, and towards the end of the path, I want it to check a certain folder.
My current code is something like
string path = "\\\\" + computerList + "\\C$\\Program Files (x86)\\blah1\\blah2\\";
string searchPattern = "*_*";
DirectoryInfo di = new DirectoryInfo(path);
DirectoryInfo[] directories =
di.GetDirectories(searchPattern, SearchOption.AllDirectories);
followed by
foreach (DirectoryInfo dir in directories)
{
versionInformation.Add(computerList+" "+dir.Parent.Parent.Parent+" "+dir.Parent + " " + dir.Name);
}
What I want it to do is take the results from the directory search - and then add \\working\\products\\ and iterate through that full list/path.
So - in short - I want the versionInformation list to end up being
Directory information up to blah2\ - I want it to find the folder after blah2 (which it does) but then I want to append the \\working\\products\\ and use that entire path for what it ends up searching for the *_* in.
EDIT I just realized that I may have been addressing this the wrong way - It appears that my current code actually works - But when it lists the directory names, for some reason, It comes out wrong...
foreach (DirectoryInfo dir in directories)
{
//DirectoryInfo threeLevelsUp = dir.Parent.Parent.Parent;
versionInformation.Add(computerList+" "+dir.Parent.Parent.Parent+" "+dir.Parent + " " + dir.Name);
//Console.WriteLine(dir.Parent + " " + dir.Name);
}
var beautifyList = string.Join(Environment.NewLine, versionInformation);
MessageBox.Show(beautifyList);
The first iteration for (using the below folders as an example) ICanBeDifferent will result in the FIRST item found being labeled as "ICanBeDifferent", but the SECOND result (for something found under ICanBeDifferent) would return FunTimes as the parent.parent.parent.
What could be causing this?!
Example Folders
C:\Program Files (x86)\LLL\Funtimes\ICanBeDifferent\Working\Products\Superman\2015_2_0_7
C:\Program Files (x86)\LLL\Funtimes\ICanBeDifferent\Working\Products\Office\2015_2_2_43
C:\Program Files (x86)\LLL\Funtimes\ThisIsWhatChanges\Working\Products\Lanyard\2015_2_0_70
To me it seems like you want the Path.Combine() method and use it like
string resultDir = Path.Combine(dir, "..\\working\\products");
if dir is a string or
string resultDir = Path.Combine(dir.FullName, "..\\working\\products");
if dir is a DirectoryInfo.
I need to read a text file that I know its full path, except one folder's name. I' d use
string readText = File.ReadAllText(path + "\\" + unknownFolderName + "\\" + itemName);
but first, I need to find out unknownFolderName to reach the file' s full path. There is exactly one folder under path, all I need to do is entering under this folder, without knowing its name. How can I achieve this in simplest way?
You could try using Directory.GetDirectories(). If you're guaranteed to only have one folder underneath that folder, then you should be able to do it VIA:
string unknownPath = Directory.GetDirectories(path)[0];
//Now instead of this: [ string readText = File.ReadAllText(path + "\\" + unknownFolderName + "\\" + itemName) ], do this:
string readText = File.ReadAllText(unknownPath + "\\" + itemName);
That should do it. Let me know if it works out for you!
You could use Directory.GetDirectories static method (documentation) which returns the array of strings - full paths to the direcotries in the path you passed to the method. So try something like this (if you are sure that there is at least one directory and you want to use the first one):
string readText = File.ReadAllText(Directory.GetDirectories(path)[0] + "\\" + itemName);
In case you have more than one folder, and you don't know which one is:
Take a look at the following example. You're looking for Windows in the following path: C:\_____\System32\notepad.exe
string path = #"C:\";
var itemName = #"System32\notepad.exe";
var directories = Directory.GetDirectories(path);
foreach (var dir in directories) {
string fullPath = Path.Combine(dir, itemName);
//If you found the correct directory!
if (File.Exists(fullPath)) {
Console.WriteLine(fullPath);
}
}
Use this to get the folder names under your directory:
http://www.developerfusion.com/code/4359/listing-files-folders-in-a-directory/