0

私は現在、ファイルを送信するWebサービスを構築しています。これは、送信しているファイルからmime-typeも取得しますが、何らかの理由で、アプリケーションはファイルを開くことはもちろん、ファイルを見ることができません。

私の道は

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

(これは私のアプリケーションによって作成されます。Chromeをローカルで使用し、そのアドレスを貼り付けると、アプリケーションはそのパスのデバッグフォルダーにコンパイルされます。正常に機能し、chromeはファイルを表示してアクセスできます。

私の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"

はいfile:\は.NetFrameworkから取得されます

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

コンストラクターに送信されるこのアプリケーションパスは、すべての正しい呼び出しから与えられるものであるため、.Net Frameworkによって与えられるfile:\を含めるべきではないと言ってはいけません。

4

2 に答える 2

2

file:\\ファイル名の先頭から を削除してみてください。

編集:呼び出しApplication.ExecutablePathで CodeBase 参照の代わりに 使用してみてください。Path.GetDirectoryName()アセンブリへの参照を追加する必要がある場合がありますSystem.Windows.Forms

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

編集2:

使用できる場合もあります(私のdllから取得):

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

それで:

string ApplicationPath = Application().DirectoryName;
于 2012-05-07T20:01:30.377 に答える
0

System.IO.FileURI ではなくファイル名で動作するため、file:/プレフィックスは認識されません。Chrome が機能するのは、URI をシステム ファイル名に変換するためです。

于 2012-05-07T20:05:31.683 に答える