(C#) unescape string - c#

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

Related

How do I use an illegal character?

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

Having trouble while adding double quotes to a string that is inside a variable in C#?

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.

C# Exception when creating a file when file name has spaces throws an error {"The given path's format is not supported."}

Um trying to create a pdf file with the file name as follows
Hello 1115 Apple Mango 27.08.2015 00:00:00.pdf
using
var tempFileName = Fruit.Name + " " + numberName + " " + DateTime.Now.Date.ToString() + ".pdf";
var pdfFile = Path.Combine(Path.GetTempPath(), tempFileName);
System.IO.File.WriteAllBytes(pdfFile, Pdfcontent.GetBuffer());
Please note that my file name contain spaces, if I create a file name without spaces it will generate a file without any issues
Since it's containing spaces it throws an exception {"The given path's format is not supported."}
The Generated filepath looks something like this
C:\Users\Sansa\AppData\Local\Temp\Hello 1115 Apple Mango 27.08.2015 00:00:00.pdf
How to fix this issue
: are not allowed in the file names. You could remove them.
Also you could replace spaces with the underscores _ if you want.
The problem isn't in spaces. There are a few symbols, that deniend in naming: <, >, :, ", /, \, |, ?, *. Also you can check the rules for naming files and folders on MSDN.
You can fix this issue by replacing this symbols to allowed. In your case you can use simple replace:
tempFileName = tempFileName.Replace(':', '_'); // prevent using : symbol
But much better is to get all unallowed symbols and use Regex to prevent using them:
var pattern = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
var r = new Regex(string.Format("[{0}]", Regex.Escape(pattern)));
tempFileName = r.Replace(tempFileName, "_");
If you choose second variant, don't forget to add namespaces in your file:
using System.IO;
using System.Text.RegularExpressions;

Escape for folder Exists and Create purposes

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

How to enter a folder without knowing its name?

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/

Categories

Resources