Метод File.Copy делает файл недоступным

Я борюсь с этим уже некоторое время. Я не могу получить доступ к файлу после вызова метода File.Copy. Вот что я пробовал:

File.Copy(sourceFile, destinationFile, true);
FileStream fs = File.Open(destinationFile, FileMode.Open);

Я получаю UnauthorizedAccessException во второй строке. Пишет: Доступ к пути... запрещен. Я также попробовал предложение, изложенное здесь, но это не сработало.

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ: Вот что я узнал. Если я сделаю это:

File.Copy(sourceFile, destinationFile, true);
FileStream fs = File.Open(destinationFile, FileMode.Open, FileAccess.Read);

Он не выдает исключения. Файл, к которому я пытаюсь получить доступ, доступен только для чтения. Итак, я попытался удалить атрибут только для чтения следующим образом:

File.Copy(sourceFile, destinationFile, true);
FileInfo fileInfo = new FileInfo(destinationFile);
fileInfo.IsReadOnly = false;
FileStream fs = File.Open(destinationFile, FileMode.Open, FileAccess.ReadWrite);

И я получаю то же исключение, что и раньше. Кстати, я проверил, могу ли я открыть файл вручную и отредактировать его, и я могу. Конечно, когда я снимаю флажок только для чтения. Я также проверил атрибуты файла в проводнике Windows во время отладки, сразу после третьей строки, и файл больше не доступен только для чтения. Проверив все это, я не понимаю, почему исключение выдается на четвертой строке.


person Vale    schedule 06.06.2011    source источник
comment
Попробуйте поместить System.Threading.Thread.Sleep(1000); между строками, чтобы увидеть, не является ли это проблемой синхронизации (файл все еще может быть заблокирован File.Copy()).   -  person oleschri    schedule 06.06.2011
comment
Я пытался сделать что-то подобное. Я создал цикл while, который должен выйти, если исключение не выброшено. Но так и не вышел...   -  person Vale    schedule 06.06.2011
comment
Вы пытались удалить атрибут только для чтения перед копированием?   -  person leppie    schedule 07.06.2011
comment
@leppie Да, прямо сейчас, для исходного файла, и это сработало, но это неправильный способ сделать это, потому что файл должен оставаться только для чтения. Я могу вернуть его только для чтения... Но я хочу знать, почему файл назначения недоступен, и можно ли это сделать без изменения исходного файла. Спасибо.   -  person Vale    schedule 07.06.2011
comment
@Vale: Черт, но это только начало :) Что происходит, когда вы «двойное переключение» только для чтения (в источнике или месте назначения)?   -  person leppie    schedule 07.06.2011
comment
@leppie Это действительно сработало с целевым файлом! Я не знаю, как вы это придумали, но это решило мою проблему. Спасибо большое.   -  person Vale    schedule 07.06.2011
comment
@Vale: Образованное предположение :)   -  person leppie    schedule 07.06.2011


Ответы (2)


Вы уверены, что вы не можете открыть ТОЛЬКО файлы, скопированные с помощью File.Copy, а не все файлы в целевой папке? И это обычная папка NTFS или сетевая папка?

Если вы используете антивирусное или защитное программное обеспечение, попробуйте отключить его. После создания файла они часто открывают файл для его сканирования.

Обновить

Согласно http://msdn.microsoft.com/en-us/library/b9skfh7s.aspx - UnauthorizedAccessException, брошенный File.Open, не будет выдавать сообщение "Доступ к пути... запрещен". (изменить: я тоже не вижу это сообщение для File.Copy, так что это может быть неправильно)

Я подозреваю, что это ваш File.Copy не работает с этим исключением, и у вас нет прав на чтение исходного файла или запись целевого файла. Вы, вероятно, смотрите на выделенную строку исходного кода, которая показывает следующую строку, которую нужно выполнить.

Итак, может быть, ваша копия выходит из строя, а не File.Open?

person Kieren Johnstone    schedule 06.06.2011
comment
Проблема в том, что файл сначала не существует, затем я копирую и пытаюсь получить доступ к файлу назначения. Я уверен, что у меня есть все необходимые права, потому что я справляюсь с этим на рабочем столе. - person Vale; 06.06.2011
comment
Боже, я не знаю, как мне сделать это проще. Пожалуйста, ответьте на каждый вопрос и проверьте, что у вас есть, прежде чем нажимать «Добавить комментарий»: 1) Можете ли вы открывать другие файлы в целевой папке? 2) Это обычная папка NTFS или сетевая папка? 3) Пробовали ли вы отключить все защитные программы/антивирусы? - person Kieren Johnstone; 06.06.2011
comment
Не знаю, для чего был четвертый да, и вы не указали, была ли это папка NTFS или сетевая папка. Тем не менее, я думаю, что вы смотрите на неправильное утверждение. Пожалуйста, смотрите обновленный ответ :) - person Kieren Johnstone; 06.06.2011
comment
Ваш чертов рабочий стол может быть общим сетевым ресурсом, что может помочь объяснить проблему. Нет причин предполагать, что все очевидно и на них можно быстро ответить, очевидно, что вы не смогли решить свою собственную проблему и, возможно, упустили некоторые детали; решение такого рода вещей требует тщательного изучения деталей. - person Kieren Johnstone; 06.06.2011
comment
Вы перепроверили, не был ли сбой File.Copy? - person Kieren Johnstone; 06.06.2011
comment
Да, я сделал. Когда я использую только File.Copy, он нормально копирует файл. - person Vale; 07.06.2011

Попробуй это!


   private bool CheckFileHasCopied(string FilePath)
    {
        try
        {
            if (File.Exists(FilePath))
            {
                using (File.OpenRead(FilePath))
                {
                    return true;
                }
            }
            else
            {
                return false;
            }
        }
        catch (Exception)
        {
            Thread.Sleep(2000);
            return CheckFileHasCopied(FilePath);
        }

    }

if (CheckFileHasCopied(destinationFile)) { File.Delete(sourceFile); }
person zeshan sadiq    schedule 24.06.2011