从 FileStream 获取文件描述符句柄

Gus*_*oTM 5 c# mono monomac

我正在使用这个库https://github.com/ahawker/NLibsndfile使用来自 C# 的 libSndFile 转换音频文件,我做了这个方法,用于转换(转换 wav 到 aiff):

        string sourcePath = "/User/Dev/Desktop/a.wav";
        string targetPath = "/User/Dev/Desktop/b.aiff";

        var file = File.Create(targetPath);
        file.Close();
        file.Dispose();
        IntPtr ptrTargetFile = file.SafeFileHandle.DangerousGetHandle();

        LibsndfileInfo wavInfo = new LibsndfileInfo();
        LibsndfileInfo aiffInfo = new LibsndfileInfo();
        LibsndfileApi api = new LibsndfileApi();

        var wavFile = api.Open(sourcePath, LibsndfileMode.Read, ref wavInfo);
        var aiffFile = api.OpenFileDescriptor((int)ptrTargetFile, LibsndfileMode.Rdwr, ref aiffInfo, 0);

        aiffInfo.Channels = wavInfo.Channels;
        aiffInfo.SampleRate = wavInfo.SampleRate;
        aiffInfo.Format = LibsndfileFormat.Aiff;

        short[] buffer = new short[512];

        long countOfItemsWritten = 0;
        long countOfItemsReaded = 0;

        while ((countOfItemsReaded=api.ReadItems(wavFile, buffer, buffer.Length))>0)
            countOfItemsWritten = api.WriteItems(aiffFile, buffer, countOfItemsReaded);

        api.Close(wavFile);
        api.Close(aiffFile);
Run Code Online (Sandbox Code Playgroud)

问题是在打开aiff文件的时候,该方法api.OpenFileDescriptor总是返回一个空指针。库方法是这样的:internal static extern IntPtr sf_open_fd(int handle, LibsndfileMode mode, ref LibsndfileInfo info, int closeHandle);

知道为什么操作失败吗?或者如何从 FileStream 获取文件描述符处理程序?

Mat*_*son 5

您可以像这样获取描述符:

首先使用FileStream.SafeFileHandle并使用它的值来访问SafeHandle.DangerousGetHandle()

所以: IntPtr handle = fileStream.SafeFileHandle.DangerousGetHandle();