1

这是对您的挑战 - .NET C# 4.0 或更低版本。

我有一个基本的 C# 应用程序,它在表单上有一个按钮。

该按钮使用一个 API,它将文件路径作为音频文件位置的参数。然后API 允许调用文件,例如someoneElsesAPI.Play("C:\myfile.vox") 来播放文件。

我无法控制 API。我必须使用 API - 那里别无选择。

问题是,音频文件 (.vox) 存储在数据库中(作为 blob)。如何向 API 提供文件名,同时提供从数据库流式传输的内容以播放文件?

例如,在 ASP.NET 中,可以使用处理程序或 aspx 页面动态显示图像,并将响应输出为图像。我想对 C# 桌面应用程序中的音频文件执行相同的技巧。

音频文件的类型无关紧要 - 我需要知道如何通过不存在的文件路径调用文件(但确实作为数据库中的 blob 存在)。

呵呵,我要求不高吧?

多谢。

祝你在这个挑战中好运!

担。

4

3 回答 3

3

我不认为它可以以任何合理的方式完成。相反,您可以轻松获取 blob。将其保存到临时文件,并将临时文件的路径提供给 API。它不会提供任何类型的流式传输,但正如您可能想象的那样,覆盖 .net 处理文件系统的方式并非易事。你为什么要这样做?如果这对您来说是一个真正的问题,我建议您将您使用的 API 更改为另一个支持您尝试实现的 API,而不是寻找hacky解决方案。

于 2010-11-04T12:27:48.083 回答
3

从数据库中读取 blob,将文件存储到临时文件中,然后将临时文件名传递给 api

于 2010-11-04T12:28:44.963 回答
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!");
                }
            }
        }
    }
}

现在,您可以从命令提示符运行“type \\.\pipe\hello.txt”,以查看某些应用程序如何读取管道,就好像它是一个文件一样。“文件名”将始终是“\\.\pipe\”,后跟管道名。

不过,这不适用于所有应用程序或 API。例如“sort.exe \\.\pipe\hello.txt”有效,但“more.exe \\.\pipe\hello.txt”无效。

于 2011-01-20T16:51:31.650 回答