166 / 138 / 23
Регистрация: 02.01.2011
Сообщений: 913
1

Если во время работы програмы файл открыт("ручками", например), то выдается ошибка

27.04.2011, 09:01. Показов 3057. Ответов 21
Метки нет (Все метки)

Программа открывает фаил, записывает данные, закрывает файл. Если во время работы програмы файл открыт("ручками", например), то выдается ошибка "The process cannot access the file 'd:\ААА' because it is being used by another process". Как можно с этим бороться? Спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.04.2011, 09:01
Ответы с готовыми решениями:

пользователь вводит название животного (например, "кот"), а в ответ ему выдается "мяу"
Всем привет! Требуется следующая помощь. Есть готовая задача "Калькулятор", нужно переделать ее...

Ошибка авторизации "Операция не допускается, если объект открыт"
В бд хранятся пользователи и пароли.Для авторизации в приложении использую код : ...

Представление данных в ячейках GridView. например, если 0 - записать "мужчина", если 1 - "женщина"
Здравствуйте! Вопрос наверное простой, но я даже не знаю как его загуглить толком. Укажите...

Ошибка времени выполнения: "Файл не открыт"
Задание: Требуется распечатать исходный файл, а также все результирующие файлы. Составить...

21
44 / 45 / 15
Регистрация: 11.08.2010
Сообщений: 226
27.04.2011, 14:55 2
file.Dispose();
0
166 / 138 / 23
Регистрация: 02.01.2011
Сообщений: 913
27.04.2011, 16:01  [ТС] 3
File.Dispose освобождает ресурс, только я же не могу открыть уже открытыи(не моей программои) файл. Чем же мне это поможет? Поясните, пожалуйста
0
145 / 145 / 26
Регистрация: 09.10.2009
Сообщений: 261
27.04.2011, 19:14 4
Покажите код. Как вы с этим файлом работаете?
0
166 / 138 / 23
Регистрация: 02.01.2011
Сообщений: 913
28.04.2011, 08:20  [ТС] 5
C#
1
2
3
4
5
6
7
8
9
10
11
12
string f=@"d:\somefile.csv";
 try 
          //.....................
                StreamWriter sr = new StreamWriter(f, false, System.Text.Encoding.GetEncoding(1251)); 
                sr.WriteLine("..............") //запись данных
            //..........................
            }
            catch(Exception ex)
            {  Console.Write(ex.Message);
                Console.ReadKey();
            }
            finally{}*/
0
145 / 145 / 26
Регистрация: 09.10.2009
Сообщений: 261
28.04.2011, 11:46 6
Попробуйте так:
C#
1
2
3
4
5
6
7
8
9
10
11
                const string file = @"d:\somefile.csv";
 
                using (var fs = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write))
                {
                    using (var sw = new StreamWriter(fs, Encoding.GetEncoding(1251)))
                    {
                        sw.WriteLine(/* данные */);
                        // В случае наличия объемного потока непрерывно записываемых данных, можно поставить:
                        // Thread.Sleep(/* задержка */);
                    }
                }
Без задержки конечно существует риск завесить приложение, которым открываете файл (при большом объеме непрерывно записываемых данных). Но при ее наличии, можно без проблем открыть файл и прочитать его содержимое. Причем, это не помешает в одно и то же время что-либо писать в него. И никаких ошибок доступа.
0
166 / 138 / 23
Регистрация: 02.01.2011
Сообщений: 913
30.04.2011, 02:04  [ТС] 7
Спасибо за ответ, но увы, и с ВАшим вариантом при открытом файле csv получила ту же ошибку
Миниатюры
Если во время работы програмы файл открыт("ручками", например), то выдается ошибка  
0
6043 / 3452 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
30.04.2011, 12:13 8
МОжет файл используется какой-то другой программой?
0
36 / 31 / 2
Регистрация: 31.12.2009
Сообщений: 349
30.04.2011, 13:18 9
Попробуй скопировать файл и открыть.
0
166 / 138 / 23
Регистрация: 02.01.2011
Сообщений: 913
30.04.2011, 17:42  [ТС] 10
В том-то и дело, что моя программа файл создает или дописывает, а другая программа использует. Т.е. есть опасение, что кто-то откроет созданныи моей програмои файл и "забудет"(все бывает) закрыть. Пока никакого другого способа как просто оставить запись в лог файле при невозможности записать что-либо в не мной открытый файл, я не нашла
0
60 / 60 / 13
Регистрация: 23.04.2011
Сообщений: 110
30.04.2011, 18:18 11
вообще для нахождения блокирующего процесса существуют специальные проги (Unlocker, например). И написать нечто подобное (а дело, кажется, к этому и идёт) не такая уж тривиальная задача, если даже удастся найти блокирующий процесс, то необходимо будет отобрать у него этот ресурс.

в принципе, можно просто копировать файл и работать уже с копией (не айс, конечно, но хоть что-то)
C#
1
File.Copy(@"C:\Docs\1.txt", @"C:\Docs\2.txt", true);
вот так, например:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            try
            {
                using (StreamWriter strw = new StreamWriter(@"C:\1.txt", true))
                {
                    strw.WriteLine("1");
                }
            }
            catch
            {
                File.Copy(@"C:\Docs\1.txt", @"C:\Docs\2.txt", true);             
                using (StreamWriter strw = new StreamWriter(@"C:\2.txt", true))
                {
                    strw.WriteLine("1");
                }
            }
1
166 / 138 / 23
Регистрация: 02.01.2011
Сообщений: 913
01.05.2011, 02:12  [ТС] 12
Спасибо, windzzor, попробую, но этот вариант мне вряд ли подоидет, т.к. имя файлов(не 1 , многих) зарезервировано(ну там, дата плюс специфическое имя, заданое пользователем) , вообшем, очень уж навороченно получается Но все-равно, большое спасибо!
0
60 / 60 / 13
Регистрация: 23.04.2011
Сообщений: 110
01.05.2011, 10:58 13
Цитата Сообщение от iva_a Посмотреть сообщение
этот вариант мне вряд ли подоидет, т.к. имя файлов(не 1 , многих) зарезервировано(ну там, дата плюс специфическое имя, заданое пользователем)
c "1.txt" это я образно, абсолютные пути в коде ведь можно заменить на строковые переменные с именем файла, считанным из, скажем, OpenFileDialog или просто из консоли
C#
1
File.Copy(sourceStr, targetStr, true); //sorceStr, targetStr - две строки с именами файлов
так что можно получить достаточно гибкий вариант, если хорошенько продумать всю эту систему с открытием файлов
0
6259 / 3560 / 898
Регистрация: 28.10.2010
Сообщений: 5,926
01.05.2011, 11:56 14
C#
1
System.IO.FileSystemWatcher
0
166 / 138 / 23
Регистрация: 02.01.2011
Сообщений: 913
02.05.2011, 10:19  [ТС] 15
Спасибо, Петрр! А можно подробнее? Я не нашла в FileSystemWatcher действие Open. Т.е. можно обнаружить, что файл был изменен, переименован, но как мне поможет, FileSystemWatcher , если файл в данный момент открыт другой программой?
0
145 / 145 / 26
Регистрация: 09.10.2009
Сообщений: 261
02.05.2011, 13:14 16
Попробуйте еще вот так:
C#
1
2
3
4
using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.Read))
{
   // Производим здесь запись.
}
C#
1
2
3
4
using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
   // Производим здесь чтение.
}
П.С. Тут ключевые моменты связаны с FileAccess и FileShare.
0
166 / 138 / 23
Регистрация: 02.01.2011
Сообщений: 913
02.05.2011, 13:39  [ТС] 17
ArtOfLife, увы..."The process cannot access the file 'd:\somefile.csv' because it is being used by another process."
0
60 / 60 / 13
Регистрация: 23.04.2011
Сообщений: 110
02.05.2011, 13:42 18
iva_a, файл открыт всегда в какой-то конкретной программе на том же компьютере?
0
166 / 138 / 23
Регистрация: 02.01.2011
Сообщений: 913
02.05.2011, 13:59  [ТС] 19
В принципе, это "защита от дурака" Т.е. моя программа создает эти фаилы(вернее собирает из базы данных), чужая считывает из них данные для web и прочего. Т.е. по идее, не должно быт так, чтобы чтобы файлы оставались открытыми... Но из практики ... Бывает все... Хочется предусмотреть как можно больше
0
145 / 145 / 26
Регистрация: 09.10.2009
Сообщений: 261
02.05.2011, 21:41 20
Если вы не контролируете процесс чтения (или я неправильно понял фразу "чужая считывает из них данные"?), то вряд ли вам удастся полностью контролировать процесс записи от подобного рода ошибок доступа. В случае, если стороннее приложение первым получило доступ к файлу с определенными правами, то "забрать" у него ваш файл можно лишь посредством убиения этого процесса, что не есть корректно.
Если же вы управляете приложениями чтения и записи, то я бы советовал использовать именованные мутексы. Тогда код чтения и записи будет выглядеть следующим образом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public static void Write(String pathToFile, String data)
    {
        Mutex fileLock;
 
        try
        {
            Mutex.OpenExisting("WriteMutex");
            return;
        }
        catch (Exception)
        {
            using (fileLock = new Mutex(false, "WriteMutex"))
            {
                try
                {
                    fileLock.WaitOne();
 
                    using (var fs = new FileStream(pathToFile, FileMode.Append, FileAccess.Write, FileShare.None))
                    {
                        using (var sw = new StreamWriter(fs))
                        {
                            sw.WriteLine(data);
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
                finally
                {
                    fileLock.ReleaseMutex();
                }
            }
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public static string Read(String pathToFile)
    {
        Mutex fileLock;
 
        try
        {
            Mutex.OpenExisting("ReadMutex");
            return null;
        }
        catch (Exception)
        {
            using (fileLock = new Mutex(false, "ReadMutex"))
            {
                try
                {
                    fileLock.WaitOne();
                    using (var fs = new FileStream(pathToFile, FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read))
                    {
                        using (var sr = new StreamReader(fs))
                        {
                            return sr.ReadToEnd();
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
                finally
                {
                    fileLock.ReleaseMutex();
                }
            }
        }
 
        return null;
    }
Запускал эти варианты в бесконечных циклах с задержкой, работало корректно. Конечно до тех пор, пока "чужой" процесс не вклинится.
В принципе, если вы не контролируете процесс чтения, то можно подкорректировать выше указанный код записи следующим образом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public static bool Write(String pathToFile, String data)
    {
        Mutex fileLock;
 
        try
        {
            Mutex.OpenExisting("WriteMutex");
            return false;
        }
        catch (Exception)
        {
            using (fileLock = new Mutex(false, "WriteMutex"))
            {
                try
                {
                    fileLock.WaitOne();
 
                    using (var fs = new FileStream(pathToFile, FileMode.Append, FileAccess.Write, FileShare.None))
                    {
                        using (var sw = new StreamWriter(fs))
                        {
                            sw.WriteLine(data);
                        }
                    }
                }
                catch (Exception)
                {
                    return false;
                }
                finally
                {
                    fileLock.ReleaseMutex();
                }
            }
        }
 
        return true;
    }
Теперь при открытии файла "ручками" мы будем попадать в блок catch, возвращая false. Эту функцию можно вызывать по таймеру. Т.е., если данные не записаны (вернуло false), то некоторое время пробовать записать их повторно, с определенным таймаутом. Ну а если процесс все же не отпускает файл, то тогда вам следует надавать по рукам разработчику модуля чтения за монополизацию общих ресурсов.

Добавлено через 13 минут
П.С. Только название мутекса в обоих модулях должно быть одинаковым.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.05.2011, 21:41
Помогаю со студенческими работами здесь

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

Выдается ошибка использована неинициализированная локальная переменная "H" и "V"
#include<conio.h> #include<iostream> using namespace std; int main(){ double S,T,H,U;...

Замена символа на его двухзначный порядковый номер в алфавите (например "а" меняется на "01", "к" на "12")
Нужна помощь

Ошибка во время работы в Corel ("экран смерти")
Машина новая, стоит "Зверь". При включении Corel вылетел в синий экран, пишет ошибку: ***STOP:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru