mciSendString не может сохранить путь к каталогу - PullRequest
0 голосов
/ 18 июля 2009

VS C # 2008 SP1

У меня есть небольшое приложение, которое записывает и воспроизводит аудио. Однако моему приложению необходимо сохранить волновой файл в каталог данных приложения на компьютере пользователя.

mciSendString принимает строку стиля C в качестве параметра и должна иметь формат 8.3. Однако моя проблема в том, что я не могу ее спасти. И что странно, иногда это происходит, а иногда нет. Однако большую часть времени это неудачи. Тем не менее, если я сохраню непосредственно на диск C, он работает в первый раз все. Я использовал 3 разных метода, которые я кодировал ниже.

Номер ошибки, которую я получаю при сбое, равен 286. «Файл не был сохранен. Убедитесь, что в вашей системе достаточно места на диске или нет сетевого соединения» *

Большое спасибо за любые предложения,

[DllImport("winmm.dll",CharSet=CharSet.Auto)]
        private static extern uint mciSendString([MarshalAs(UnmanagedType.LPTStr)] string command,
                                                 StringBuilder returnValue,
                                                 int returnLength,
                                                 IntPtr winHandle);

        [DllImport("winmm.dll", CharSet = CharSet.Auto)]
        private static extern int mciGetErrorString(uint errorCode, StringBuilder errorText, int errorTextSize);

[DllImport("Kernel32.dll", CharSet=CharSet.Auto)]
        private static extern int GetShortPathName([MarshalAs(UnmanagedType.LPTStr)] string longPath,
                                                   [MarshalAs(UnmanagedType.LPTStr)] StringBuilder shortPath,
                                                    int length);






 // Stop recording
        private void StopRecording()
        {
            // Save recorded voice
            string shortPath = this.shortPathName();
            string formatShortPath = string.Format("save recsound \"{0}\"", shortPath);
            uint result = 0;
            StringBuilder errorTest = new StringBuilder(256);

            // C:\DOCUME~1\Steve\APPLIC~1\Test.wav
            // Fails
            result = mciSendString(string.Format("{0}", formatShortPath), null, 0, IntPtr.Zero);
            mciGetErrorString(result, errorTest, errorTest.Length);

            // command line convention - fails 
            result = mciSendString("save recsound \"C:\\DOCUME~1\\Steve\\APPLIC~1\\Test.wav\"", null, 0, IntPtr.Zero);
            mciGetErrorString(result, errorTest, errorTest.Length);         

            // 8.3 short format - fails
            result = mciSendString(@"save recsound C:\DOCUME~1\Steve\APPLIC~1\Test.wav", null, 0, IntPtr.Zero);
            mciGetErrorString(result, errorTest, errorTest.Length);

            // Save to C drive works everytime.
            result = mciSendString(@"save recsound C:\Test.wav", null, 0, IntPtr.Zero);
            mciGetErrorString(result, errorTest, errorTest.Length);

            mciSendString("close recsound ", null, 0, IntPtr.Zero);
        }


// Get the short path name so that the mciSendString can save the recorded wave file
        private string shortPathName()
        {
            string shortPath = string.Empty;
            long length = 0;
            StringBuilder buffer = new StringBuilder(256);

            // Get the length of the path 
            length = GetShortPathName(this.saveRecordingPath, buffer, 256);

            shortPath = buffer.ToString();

            return shortPath;
        }

Ответы [ 2 ]

3 голосов
/ 08 сентября 2012

Я проверяю его в C drive и D drive, он работает, пока путь к каталогу не содержит пробела. "C:\Test.wav" и "D:\mp3\test.wav" оба работают, но "D:\mp4 folder\test.wav" не работает.

1 голос
/ 18 апреля 2010

Попробуйте:

[ string directoryString = "C: \ DOCUME ~ 1 \ Steve \ APPLIC ~ 1 \"; Directory.SetCurrentDirectory (directoryString); mciSendString (@ "save recsound Test.wav", null, 0, IntPtr.Zero); mciSendString («закрыть recsound», ноль, 0, IntPtr.Zero); ]

...