Mohit Deshpande
Mohit Deshpande

Reputation: 55247

directorynotfound exception

A DirectoryNotFound exception keeps happening for no apparent reason. The exception is thrown in:

public static string[] getKeywords(string filename)  
{  
    string[] keywords = XElement.Load(filename).Elements("Keyword").Attributes("name").Select(n => n.Value).ToArray();  
    return keywords;  
}

BUT it is called in this method:

public static void SyntaxHighlight(SyntaxHighlighter.SyntaxRichTextBox textbox, Language language)  
{  
    switch (language)  
    {  
        case Language.Cmake:  
            textbox.Settings.Comment = "#";  
            string[] CmakeKeywords = getKeywords("APIs\\cmake.xml");  
            textbox.Settings.Keywords.AddRange(CmakeKeywords);  
            break;  
        case Language.CSharp:  
            textbox.Settings.Comment = "//";  
            string[] CSharpKeywords = getKeywords("APIs\\cs.xml");  
            textbox.Settings.Keywords.AddRange(CSharpKeywords);  
            break;  
        case Language.HTML:  
            textbox.Settings.Comment = "<!";  
            string[] HTMLKeywords = getKeywords("APIs\\html.xml");  
            textbox.Settings.Keywords.AddRange(HTMLKeywords);  
            break;  
        case Language.Python:  
            textbox.Settings.Comment = "#";  
            string[] PythonKeywords = getKeywords("APIs\\python.xml");  
            textbox.Settings.Keywords.AddRange(PythonKeywords);  
            break;  
    }  
}

UPDATE:
I have a folder in my project called APIs. I checked the file names several times. Here is the exception: Could not find a part of the path 'C:\Users\Mohit\Documents\Visual Studio 2010\Projects\Notepad\Notepad\bin\Debug\APIs\cs.xml'. Thats the EXACT path of the file!

Upvotes: 0

Views: 324

Answers (6)

Ben Ziegler
Ben Ziegler

Reputation: 973

I tried @nobugz method and it worked. Once you set the properties of each *.xml file to:

The best way to organize it is to add the .xml files to your project with Project + Add Existing. Select them in Solution Explorer and in the Properties window set Build action = None and Copy to Output Directory = Copy if Newer. Build. That puts the files in the same directory as your .exe.

Then put this to get your path for each case in your switch case replacing "filename" with each filename you have.

string[] YourVar = getKeywords(string.Format("{0}\\APIs\\filename.xml", Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)));

Upvotes: 0

Rob Levine
Rob Levine

Reputation: 41338

I'd recommend changing your getKeywords method to be something like this to aid debugging

public static string[] getKeywords(string filename)  
{  
    var file = new FileInfo(filename);
    if (!file.Exists)
    {
        throw new FileNotFoundException("The requested file was not found: " + file.FullName);
    }
    string[] keywords = XElement.Load(filename).Elements("Keyword").Attributes("name").Select(n => n.Value).ToArray();  
    return keywords;  
}

This should give you the full path at which it was attempting to load the file, which should make the problematic path clear to you.

Upvotes: 0

Hans Passant
Hans Passant

Reputation: 942237

There's little hope of your program ever finding that folder. When you deploy your app, there is no project folder. The best way to organize it is to add the .xml files to your project with Project + Add Existing. Select them in Solution Explorer and in the Properties window set Build action = None and Copy to Output Directory = Copy if Newer. Build. That puts the files in the same directory as your .exe.

Find them back at runtime with System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location)

Upvotes: 3

noctonura
noctonura

Reputation: 13123

Looks like you are assuming the current directory is the install directory? You should find the directory like...

string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) +
              Environment.DirectorySeparatorChar +
              "file you are looking for".

Upvotes: 1

Geo
Geo

Reputation: 96947

Are you sure your working directory is the right one? Try to print the absolute path of the . directory. Also, list it's contents and see if that directory really is there.

Upvotes: 0

David Hedlund
David Hedlund

Reputation: 129832

You might have better luck a fully qualified URL (eg @"D:\mypage\APIs\html.xml")

Upvotes: 1

Related Questions