2010-11-04 43 views
1

以下是對您的挑戰 - .NET C#4.0或更低版本。通過數據庫模擬C#文件路徑

我有一個基本的C#應用​​程序,它有一個窗體上的單個按鈕。

該按鈕使用一個API,它將文件路徑作爲音頻文件位置的參數。 該API然後允許調用該文件,例如someoneElsesAPI.Play(「C:\ myfile.vox」)來播放該文件。

我無法控制API。我必須使用API​​ - 別無選擇。

問題是,音頻文件(.vox)存儲在數據庫中(作爲blob)。 如何向API提供文件名,但是爲了播放文件而提供從數據庫流式傳輸的內容?

例如,在ASP.NET中,可以使用處理程序或aspx頁面動態顯示圖像,並將響應輸出爲圖像。我想對C#桌面應用程序中的音頻文件執行相同的技巧。

音頻文件的類型是不相關的 - 我需要知道如何通過不存在的文件路徑調用文件(但確實存在作爲數據庫中的斑點)。

呵呵我不問我有多少?

Mucho謝謝。

在這個挑戰中祝你好運!

丹。

+2

您的第一個錯誤是將二進制數據存儲在數據庫中。 – leppie 2010-11-04 12:26:24

+0

我沒有看到將二進制數據存儲在數據庫中的任何錯誤。並不是說數據庫總是要走的路,但對於大量的用例來說,它絕對是一個有效的解決方案。 – Guillaume 2010-11-04 12:28:55

+0

沒有「好」和「乾淨」的解決方案來解決這個問題。將音頻文件存儲在數據庫中只是糟糕的設計。你應該真的重新考慮這一點。 – 2010-11-04 12:30:34

回答

3

我不認爲這可以用任何合理的方式完成。相反,您可以輕鬆獲取blob。將其保存到臨時文件並將臨時文件的路徑提供給API。它不會提供任何形式的流式傳輸,但正如您可以想象的那樣,覆蓋方式.net處理文件系統不是一件容易做到的事情。你爲什麼?如果這是您的真實問題,我會建議將您使用的API更改爲另一個支持您嘗試實現的API,而不是尋找hacky解決方案。

+0

我已經將文件存儲爲臨時文件,因爲這是API公開的內容。但我不想保存文件 - 這就是爲什麼我問。 – 2010-11-04 12:48:20

+0

此外,正如我的問題所述 - 我無法更改API。我別無選擇,只能使用API​​ - 所以我正在擴展.NET以充分利用我所擁有的。 – 2010-11-04 12:53:23

3

從數據庫中讀取團塊,將文件保存到臨時文件,然後通過臨時文件名到API

+0

這就是我已經做的,因爲目前,那是我唯一的選擇。 – 2010-11-04 12:49:14

+0

你可以建議一個計劃B嗎? – 2010-11-04 12:54:21

0

根據API如何打開文件時,您可能能夠使用NamedPipe作爲「虛擬文件」。

該命令行示例創建一個名爲hello.txt的命名管道,並向其中寫入一些「數據」。

using System; 
using System.IO; 
using System.IO.Pipes; 

namespace TestNamedPipe 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (var pipe = new NamedPipeServerStream("hello.txt")) 
      { 
       pipe.WaitForConnection(); 
       using (var writer = new StreamWriter(pipe)) 
       { 
        writer.WriteLine("Hello, World!"); 
       } 
      } 
     } 
    } 
} 

現在,你可以在命令提示符下運行「中輸入\\。\管\ hello.txt的」怎麼看管道可以通過一些應用程序讀取,就好像是一個文件。 「文件名」將始終爲「\\。\ pipe \」,後跟管道名稱。

雖然這不適用於所有應用程序或API。例如「sort.exe \\。\ pipe \ hello.txt」可以工作,但「more.exe \\。\ pipe \ hello.txt」不會。