Member 12363094 Ответов: 1

Как проверить, используется ли файл перед удалением этого файла.


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

но я получаю несанкционированное исключение на сервере.
я удаляю файл, когда он используется, но я не знаю точно, что происходит.

строковое имя файла = "file1.txt";
строка filename1 = "file1Copy.txt";
string filesource = сервер.MapPath ("~/Lucky/") + имя файла;
строка destinationFile = сервер.MapPath ("~/LuckyCopy/") + filename1;
если (системы.ИО.Файл.Существует(destinationFile))
{

Системы.ИО.Файл.SetAttributes(destinationFile, FileAttributes.Обычный);
Системы.ИО.Файл.Удалить(destinationFile);

}

Системы.ИО.Файл.Copy (filesource, destinationFile, true);
Системы.ИО.Файл.SetAttributes(destinationFile, FileAttributes.Обычный);

Что я уже пробовал:

я пробовал как

string filename = "file1.txt";
            string filename1 = "file1Copy.txt";
            string filesource = Server.MapPath("~/Lucky/") + filename;
            string destinationFile = Server.MapPath("~/LuckyCopy/") + filename1;
if (System.IO.File.Exists(destinationFile))
    {

                System.IO.File.SetAttributes(destinationFile, FileAttributes.Normal);
                System.IO.File.Delete(destinationFile);

            }

            System.IO.File.Copy(filesource, destinationFile, true);
            System.IO.File.SetAttributes(destinationFile, FileAttributes.Normal);

Soner Gönül

На какой линии вы получаете это исключение? Кстати, что такое полное исключение?

Member 12363094

не знаю, в локальной системе работает нормально, но на сервере не работает.
Доступ к пути есть destinationFile\filename1.txt отрицал.
Описание: необработанное исключение возникло во время выполнения текущего веб-запроса.

F-ES Sitecore

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

Atlapure Ambrish

Проверили, доступна ли папка/файл только для чтения на сервере? если это так, просто удалите флаг только для чтения из свойств папки/файла и посмотрите, работает ли он.

1 Ответов

Рейтинг:
1

Satya Prakash Swain

protected virtual bool IsFileLocked(FileInfo file)
{
    FileStream stream = null;

    try
    {
        stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None);
    }
    catch (IOException)
    {
        //the file is unavailable because it is:
        //still being written to
        //or being processed by another thread
        //or does not exist (has already been processed)
        return true;
    }
    finally
    {
        if (stream != null)
            stream.Close();
    }

    //file is not locked
    return false;
}

Проверка с помощью FileAccess.ReadWrite не будет работать для файлов только для чтения, поэтому решение было изменено для проверки с помощью FileAccess. Read. Пока это решение работает, потому что пытается проверить с помощью FileAccess.Чтение завершится неудачей, если файл имеет блокировку записи или чтения, однако это решение не будет работать, если файл не имеет блокировки записи или чтения, то есть он был открыт (для чтения или записи) с помощью FileShare.Чтение или обмен файлами.Доступ на запись.

Оригинал: я использовал этот код в течение последних нескольких лет, и у меня не было никаких проблем с ним.

Поймите, что вы сомневаетесь в использовании исключений, но вы не можете избегать их все время:


George Swan

Является ли этот ответ оригинальным или вы скопировали его с
c# - есть ли способ проверить, используется ли файл? - переполнение стека