Команда удаления информации о файле

Мое приложение делает это, воспроизводит выбранный звук с помощью wmplib, и после statechangeevent = 1 (медиаплеер остановлен) я закрываю плеер с помощью команды close() и устанавливаю URL-адрес в «»;

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

Я пробовал этот способ, медленно отлаживая, и обнаружил, что команда File info delete() требует больше времени для удаления, поскольку закрытие медиаплеера занимает больше времени для его удаления, поэтому всякий раз, когда я пытаюсь перезагрузить коллекций после удаления воспроизводимой в данный момент песни, удаленная песня остается там. Когда я пытался удалить, когда медиаплеер не воспроизводит песню, он удаляется быстро, и перезагрузка коллекций показывает, что песня исчезла.

Вопрос в том, как удалить воспроизводимый в данный момент файл, чтобы при перезагрузке коллекций отображался правильный номер песни в каталоге?

Любая помощь будет принята с благодарностью.

Мой код, как показано ниже.

 DirectoryInfo di = new DirectoryInfo(@"C:/Sounds/Custom Sounds/");
        FileInfo[] filepaths = MultipleFileFilter(di, "*.mp3,*.wma,*.wav");
        for (int i = 0; i < filepaths.Length; i++)
        {
            if (Path.GetFileNameWithoutExtension(Convert.ToString(filepaths[i]))== deleteItem)
            {

                System.IO.FileInfo fi = new System.IO.FileInfo(@"C:/Sounds/Custom Sounds/" + Convert.ToString(filepaths[i]));
                fi.Delete();
            }
        }

// Load the sounds
        DirectoryInfo dii = new DirectoryInfo(@"C:/Sounds/Custom Sounds/");
        FileInfo[] filess = MultipleFileFilter(dii, "*.mp3,*.wma,*.wav");
        for (int i = 0; i < filess.Length; i++)
        {
            RadioButton rb = new RadioButton();
            rb.Text = Path.GetFileNameWithoutExtension(filess[i].ToString());
            rb.Name = Path.GetFileName(filess[i].ToString());
            rb.CheckedChanged += new EventHandler(radioButton_Update);
            Point lc = new Point(15, yPos);
            rb.Location = lc;
            panelSound.Controls.Add(rb);
            lstbxCustomSounds.Items.Add(Path.GetFileNameWithoutExtension(rb.Text));

            yPos += 20;
            //add into the arraylist
            controlsCollections.Add(rb);
        }

Может в этом проблема? Потому что только удаляемый в данный момент звук вызовет эту проблему?

private void wPlayer_PlayStateChange(int newstate)
    {

        if (newstate == 1 )//Media finished
        {
            btnPlay.Text = "Play";
            wplayer.close();
            btnDelete.Enabled = true;
            wplayer.URL = "";
        }
        else if (newstate == 3)
        {
            btnDelete.Enabled = false;
        }

person Daniel    schedule 22.02.2010    source источник
comment
Есть ли у кого-нибудь еще предложения?   -  person Daniel    schedule 23.02.2010


Ответы (1)


Кажется, что простым ответом на эту проблему было бы запретить удаление чего-либо, что воспроизводится в данный момент... либо это, либо убедиться, что процесс удаления завершен перед перезагрузкой коллекции.

ИЗМЕНИТЬ На основе приведенного выше кода, когда вы создаете экземпляр информации о файле, который необходимо удалить, вы добавляете Convert.ToString(filepath[i]) к пути к файлу нового объекта информации о файле. Вместо этого я бы избавился от всего, что было до этого, и просто использовал бы filepath[i].FullName.

Поэтому я бы просто создал экземпляр объекта для удаления как new FileInfo(filepath[i].FullName);.

person Aaron    schedule 22.02.2010
comment
Итак, как я могу убедиться, что процесс удаления завершен до перезагрузки коллекции? Я попробовал цикл while (проверка каталога на наличие имени файла), он зависал в программе примерно на 5 секунд, прежде чем перезагружать коллекции. - person Daniel; 22.02.2010
comment
Когда вы выполняете удаление? Это в другой ветке? Я говорю обновить коллекцию сразу после оператора удаления. Независимо от того, сколько времени займет оператор удаления, он все равно будет обновляться после завершения удаления. - person Aaron; 22.02.2010
comment
Удаление не в другом потоке. Моя коллекция перезагрузки работает таким образом, просматривая каталог и находя файлы в каталоге. После того, как я удалю файл, я вызову свой метод перезагрузки коллекции, и, к сожалению, они все еще могут найти файл там. Я думал, что файл еще не полностью удален, поэтому он все еще может ощущать этот файл. - person Daniel; 22.02.2010
comment
Можете ли вы опубликовать код? Если вы вызываете функцию перезагрузки после завершения оператора удаления, каталог не должен содержать удаленный элемент. - person Aaron; 22.02.2010
comment
Даже с моим отредактированным заявлением проблема все еще должна заключаться в том, как и когда вы обновляете свой список файлов... если происходит удаление, то это обязательно будет отражено, если вы обновите свой список после удаления. . То есть, если они не происходят в разных потоках. - person Aaron; 22.02.2010
comment
Я понял, что, возможно, это проблема с медиаплеером, потому что только текущая воспроизводимая песня будет удалена, что вызовет проблему. Если удаленный элемент не воспроизводится до или после нажатия клавиши удаления, проблем не возникнет. Я прикрепил обработчик события изменения состояния медиаплеера. - person Daniel; 22.02.2010
comment
Я бы определенно предположил, что файл, который в данный момент воспроизводится, не может быть удален. - person Aaron; 22.02.2010
comment
Я уже сделал это. Вот почему я отключаю кнопку удаления. Однако сразу после того, как файл будет воспроизведен или остановлен, они смогут удалить файл, который сейчас вызывает проблему. - person Daniel; 22.02.2010
comment
Возможно, добавьте if(File.Exists(files[i].FullName)) перед добавлением в ваш список... возможно, он действительно удален, но информация о каталоге не обновляется должным образом? - person Aaron; 22.02.2010
comment
Попробовал добавить условие, сработало. Тем не менее, я попробовал еще раз, с другой песней, это не сработало. Это очень странно. ›.‹ Как я могу проверить, правильно ли он обновляется? - person Daniel; 22.02.2010
comment
Должен любить такие вещи... есть метод Refresh() для информации о каталоге. Возможно, попробуйте di.Refresh() после удаления вашего файла... Я не понимаю, как это может помочь, поскольку вы создаете новую информацию о каталоге, чтобы перерисовать свой список, но на данный момент все возможно... - person Aaron; 22.02.2010
comment
Отредактировано: предыдущий комментарий, не работает, пробовал 5 раз с файлом, все та же проблема. - person Daniel; 22.02.2010
comment
Я не могу найти выход для этого, тем временем я просто поставлю thread.sleep (5000), прежде чем кнопка удаления будет включена. Это проблема плеера, хотя я сильно чувствую. - person Daniel; 22.02.2010