Banshee
Banshee

Reputation: 15807

Could not find a part of the path?

I have the following code :

fileinfo = new FileInfo(filePathAndName);

if (!fileinfo.Exists)
{
    using (xmlWriter = new XmlTextWriter(filePathAndName, System.Text.Encoding.UTF8))
    {
        xmlWriter.Formatting = Formatting.Indented;
        xmlWriter.WriteStartDocument();
        xmlWriter.WriteStartElement("root");
        xmlWriter.WriteStartElement("objects");
        xmlWriter.WriteEndElement();
        xmlWriter.WriteEndElement();
        xmlWriter.WriteEndDocument();
        xmlWriter.Close();
    }
}

The filePathAndName will be C:/MyApp%205/Produkter/MyApp%20Utveckling/Host/Orbit.Host.Dev/bin/ExceptionLog.xml.

The folder does exists but the file does not. XmlTextWriter should in this case create the file but instead it throws Could not find part of the path.

It's probably something very obvious I have forgotten here, please help.

Edit : This is how the path really looks like :

C:\MyApp 5\Produkter\MyApp Utveckling\Host\Orbit.Host.Dev\Bin

And this is how the URL that is used in the code is generated :

 (new System.Uri(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase) + "\\ExceptionLog.xml")).AbsolutePath

Upvotes: 4

Views: 40156

Answers (5)

JustBeingHelpful
JustBeingHelpful

Reputation: 18980

If you are interacting with a path on a network (aka UNC path), you have to use Server.MapPath to turn a UNC path or virtual path into a physical path that .NET can understand. So anytime you're opening files, creating, updating and deleting files, opening directories and deleting directories on a network path, use Server.MapPath.

Example:

System.IO.Directory.CreateDirectory(Server.MapPath("\\server\path"));

Upvotes: 1

I've tried the code, ArgumentException is thrown by XmlTextWriter constructor with this message:

the URI formats are not supported.

Consider the following code:

// Get the path to assembly directory.
// There is a lot of alternatives: http://stackoverflow.com/questions/52797/
var assemblyPath = new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath;
var directoryPath = Path.GetDirectoryName(assemblyPath);

// Path to XML-file.
var filePath = Path.Combine(directoryPath, "ExceptionLog.xml");

using (var xmlTextWriter = new XmlTextWriter(filePath, Encoding.UTF8))
{
    ...
}

Upvotes: 3

RogerN
RogerN

Reputation: 3821

Use Assembly.Location and Path.Combine to form your fileNameAndPath variable:

var folder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var filePathAndName = Path.Combine(folder, "ExceptionLog.xml");

Upvotes: 0

Oliver
Oliver

Reputation: 45101

Instead of using Uri.AbsolutePath you should take Path.Combine()

var filepath = @"C:\MyApp 5\Produkter\MyApp Utveckling\Host\Orbit.Host.Dev\Bin"
var filename = Path.Combine(filepath, "ExceptionLog.xml");

var fileInfo = new FileInfo(filename);

if(!fileInfo.Exists)
{
    //ToDo: call xml writer...
}

Upvotes: 0

Naga Sandeep
Naga Sandeep

Reputation: 1431

Try this -- add @ before the filePathAndName

string filePathAndName = @"C:\MyApp 5\Produkter\MyApp Utveckling\Host\Orbit.Host.Dev\Bin\text.xml";

FileInfo fileinfo = new FileInfo(filePathAndName);

if (!fileinfo.Exists)
{
    using (XmlTextWriter xmlWriter = new XmlTextWriter(filePathAndName, System.Text.Encoding.UTF8))
    {
        xmlWriter.Formatting = Formatting.Indented;
        xmlWriter.WriteStartDocument();
        xmlWriter.WriteStartElement("root");
        xmlWriter.WriteStartElement("objects");
        xmlWriter.WriteEndElement();
        xmlWriter.WriteEndElement();
        xmlWriter.WriteEndDocument();
        xmlWriter.Close();
    }
}

Upvotes: 1

Related Questions