Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение файла используемого другим процессом 
:(
    Опции темы
alhimik
Дата 31.8.2008, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 20.7.2007

Репутация: нет
Всего: 1



Название темы само говорит за себя. И я уже гуглил и пробовал все возможные варианты с FileShare - ничего не помогло, вылетает исключение ошибки доступа к файлу. Собственно есть задание: скопировать видеофайл из кеша Opera 9.52. Он хранится в каталоге TMP. Ни Виндовс-система ни программа не может этого сделать... Почему так? И есть ли выход из данной ситуации? Вот код:

Код

using System;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                FileStream input = new FileStream(@"C:\Temp\TMP\fla5FE.tmp", FileMode.Open, FileAccess.Read, FileShare.None);
                byte[] buffer = new byte[input.Length];
                input.Read(buffer, 0, buffer.Length);
                input.Close();


                FileStream output = new FileStream(@"C:\fla5FE.flv", FileMode.Create);
                output.Write(buffer, 0, buffer.Length);
                output.Close();
            }
            catch (Exception e)
            {
                Console.Write(e.Message);
            }
        }
    }
}

PM ICQ   Вверх
Bishop
Дата 31.8.2008, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 3.6.2005
Где: Минск, Беларусь

Репутация: 6
Всего: 16



alhimik
Давай определимся с условиями. Opera 9.52 хранит кеш совсем не во временном каталоге системы, а по умолчанию в %LOCALAPPDATA%\Opera\Opera*\profile\cache4 (Opera* — имя каталога установки). Посмотреть и изменить можно введя в адресной строке opera:config#UserPrefs|CacheDirectory4. Плюс файлы называются opr????? и не блокируются. Т.е. скопировать можно вот так:
Код
string filename = @"c:\Users\Admin\AppData\Local\Opera\Opera\profile\cache4\opr12345";
string dest_dir = @"e:\Downloads";
File.Copy(filename, Path.ChangeExtension(Path.Combine(dest_dir, Path.GetFileName(filename)), "flv"));

По коду: ты пытаешься открыть файл в режиме FileShare.None, но так как он уже кем-то открыт, то система не может выполнить твое требование эксклюзивного доступа, даже если файл доступен для чтения. Вот пример:
Код
// открываем файл для записи, но разрешаем чтение
FileStream f = new FileStream(@"e:\1.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
// пытаемся открыть эксклюзивно - не выйдет
//FileStream fs = new FileStream(@"e:\1.txt", FileMode.Open, FileAccess.Read, FileShare.None);
// пытаемся открыть на чтение, но получаем ошибку, т.к. файл уже открыт на запись, т.е. маски доступа не совпадают
//FileStream fs = new FileStream(@"e:\1.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
// открываем на чтение, учитывая, что кто-то туда уже пишет, но разрешил чтение
FileStream fs = new FileStream(@"e:\1.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
fs.Close();
f.Close();

Ну а если файл действительно заблокирован, то насколько я знаю, средствами .NET прочитать его будет сложно. 3 метода работы с занятыми файлами
PM WWW ICQ   Вверх
alhimik
Дата 31.8.2008, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 20.7.2007

Репутация: нет
Всего: 1



Bishop, если использовать FileMon, то можно увидеть что в TMP тоже файл создается...и в принципе нету разницы Опера это или Firefox...но суть в том что некоторые файлы с папки TMP выгрести не удаётся. И, как всегда, стандартные средства .NET не в силе справиться с этой задчей, нужно прибегать к извращениям(
А FileShare.ReadWrite в данном случае не конает, я пробовал smile 
Очевидно, хранилище TMP организовано каким-то хитромудрым образом)

Это сообщение отредактировал(а) alhimik - 31.8.2008, 19:10
PM ICQ   Вверх
Bishop
Дата 31.8.2008, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 188
Регистрация: 3.6.2005
Где: Минск, Беларусь

Репутация: 6
Всего: 16



alhimik
Цитата(alhimik @  31.8.2008,  19:08 Найти цитируемый пост)
в TMP тоже файл создается...и в принципе нету разницы Опера это или Firefox...

Ну так это наверно временные файлы Flash plugin. Правильно понимаю, что это тот же файл, что и в кеше? Если так, не пойму логики: из двух копий файла, одна из которых в "свободном доступе", а вторая блокирована тебе нужен именно заблокированный? А если не так, то откуда уверенность, что в папке TMP вообще то, что тебе нужно? Ведь открыть и посмотреть нельзя smile
Цитата
И, как всегда, стандартные средства .NET

Стандартные средства ОС обеспечивают эксклюзивный доступ к файлу. Чтобы обойти это в любом случае "нужно прибегать к извращениям".
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0646 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.