mciSendString не может сохранить путь к каталогу
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;
}
3 ответа
I test it in C drive
а также D drive
, it works as long as the directory path does not contain space. "C:\Test.wav"
а также "D:\mp3\test.wav"
both work, but "D:\mp4 folder\test.wav"
не работает.
Попробуй это:
[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); ]
Если в пути к файлу есть пробелы, используйте кавычки вокруг имени файла. В С#, если вы используете filePath как переменную для пути к файлу, используйте следующий код:
msiSendString($"save recsound \"{filePath}\"", "", 0, 0)