Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从FileStream获取文件描述符句柄_C#_Mono_Monomac - Fatal编程技术网

C# 从FileStream获取文件描述符句柄

C# 从FileStream获取文件描述符句柄,c#,mono,monomac,C#,Mono,Monomac,我使用这个库从C#使用libSndFile转换音频文件,我使用这个方法进行转换(将wav转换为aiff): 问题是在打开aiff文件时,方法api.OpenFileDescriptor总是返回空指针。库方法如下:内部静态外部IntPtr sf_open_fd(int handle,LibsndfileMode,ref LibsndfileInfo info,int closeHandle) 知道为什么手术失败了吗?或者如何从FileStream获取文件描述符处理程序?您可以这样获取描述符: 首先

我使用这个库从C#使用libSndFile转换音频文件,我使用这个方法进行转换(将wav转换为aiff):

问题是在打开aiff文件时,方法
api.OpenFileDescriptor
总是返回空指针。库方法如下:
内部静态外部IntPtr sf_open_fd(int handle,LibsndfileMode,ref LibsndfileInfo info,int closeHandle)


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

您可以这样获取描述符:

首先使用,然后使用该值访问

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

        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);