2012-05-07 2 views
0

В настоящее время я создаю веб-службу, которая отправляет файлы, это также приводит к отправке mime-типа из файла, но по какой-то причине мое приложение не может видеть файл, который не может быть открыт.Почему мое приложение не может открыть файл, который существует?

Мой путь

file:\\C:\\Users\\Martin\\Documents\\Visual Studio 2010\\Projects\\HTML5Streamer\\ 
Debug\\Player\\player.html 

(это создается мое приложение. Мое приложение компилируется в папке отладки в этом пути, когда я использую Chrome локально и вставить этот адрес он работает отлично, хром может видеть и получить доступ к файлу,

My VS запущен от имени администратора, поэтому при компиляции приложения также работает как администратор, почему бы это получить правильный путь, то File.Exists() говорит, что не существует

public string getMimeFromFile(string filename) 
    { 
     if (!File.Exists(filename)) 
      throw new FileNotFoundException(filename + " not found"); // this is thrown 

     byte[] buffer = new byte[256]; 
     using (FileStream fs = new FileStream(filename, FileMode.Open)) 
     { 
      if (fs.Length >= 256) 
       fs.Read(buffer, 0, 256); 
      else 
       fs.Read(buffer, 0, (int)fs.Length); 
     } 
     try 
     { 
      System.UInt32 mimetype; 
      FindMimeFromData(0, null, buffer, 256, null, 0, out mimetype, 0); 
      System.IntPtr mimeTypePtr = new IntPtr(mimetype); 
      string mime = Marshal.PtrToStringUni(mimeTypePtr); 
      Marshal.FreeCoTaskMem(mimeTypePtr); 
      return mime; 
     } 
     catch (Exception e) 
     { 
      return "unknown/unknown"; 
     } 
    } 

Метод вызова это

private void ProccessPlayerRequest(HttpListenerContext context) 
     { 
      Uri content_uri = context.Request.Url; 
      string filePath = ApplicationPath + content_uri.AbsolutePath.Replace('/', '\\'); 
//ApplicationPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); 
      string mimeType = getMimeFromFile(filePath); 

      context.Response.Headers.Add("Content-Type: " + mimeType); 
      streamFileToBrowser(filePath, context); 
     } 

При использовании string filePath = Path.Combine(ApplicationPath, @"Player\player.html"); производства

"file:\\C:\\Users\\Martin\\Documents\\Visual Studio 2010\\Projects\\HTML5Streamer\\Debug\\Player\\player.html" 

да файл: \ получается из .Net Framework с

string ApplicationPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); 
      Service serv = new Service(ApplicationPath); 

Этот путь приложения отправленного в конструктор - это то, что дано из всех правильных вызовов, поэтому, пожалуйста, не говорите, что у него не должно быть файла: \, как это указано в .Net Framework

+0

Как выглядит ваша переменная filePath после ее установки? Вы должны использовать Path.Combine для одного. – banging

+0

Путь к файлу, который генерируется в моем Вопросе, пожалуйста, прочитайте, прежде чем спрашивать –

+1

Я прочитал ваш вопрос. Я не уверен, что это путь, на котором вы НАДЕЕТЕ, что это так, или это acutal путь, который имеет filePath. Пропустите отношение, когда вам понадобится помощь;) – banging

ответ

2

Попробуйте удалить file:\\ с начала имени файла.

Редактировать: Попробуйте использовать Application.ExecutablePath вместо ссылки CodeBase в вашем вызове Path.GetDirectoryName(). Возможно, вам придется добавить ссылку на сборку System.Windows.Forms.

string ApplicationPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath); 

Edit2:

Вы также можете быть в состоянии использовать (взяты из библиотеки DLL шахты):

public static FileInfo Application() 
{ 
    return new FileInfo(Environment.GetCommandLineArgs()[0]); 
} 

Тогда:

string ApplicationPath = Application().DirectoryName; 
+0

... и не забудьте подумать об ускорении обратных косых черт в строковых литералах: и «C: \\ Ping \\ Pong.txt», и '@ "C: \ Ping \ Pong.txt" 'все в порядке. – stakx

+0

Удаление файла ': \\' не работает, попробовал это –

+0

@MartinBarker Добавлено Редактирование, которое может помочь получить правильный каталог. (без 'файла: \\'). Потому что именно CodeBase предоставляет файл: \\ ', и только потому, что он дает это, это не значит, что это правильно для вашего дела. –

0

System.IO.File работает с имена файлов, а не URI, поэтому file:/ prefi x не будет распознаваться. Chrome работает, потому что он конвертирует URI в имя системного файла для вас.

+0

Файл: \\ добавлен .Net –

Смежные вопросы