Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
Sanya Black1993
2 / 0 / 1
Регистрация: 12.05.2012
Сообщений: 169
#1

Доступ к закрытому файлу невозможен - C#

23.11.2016, 15:15. Просмотров 982. Ответов 8
Метки нет (Все метки)

Пишу программу для приёма и отправки файлов по сети.
Такой код на отправку файла
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 private static void SendFile(FileStream fh)
        {
            // Создаем файловый поток и переводим его в байты
            Byte[] bytes = new Byte[fh.Length];
            fh.Read(bytes, 0, bytes.Length);
            try
            {
                // Отправляем файл
                sender.Send(bytes, bytes.Length, endPoint);
            }
            catch (Exception eR)
            {
                MessageBox.Show(eR.Message);
            }
            finally
            {
                // Закрываем соединение и очищаем поток
                fs.Close();
                sender.Close();
            }
        }
Выскакивает ошибка "Доступ к закрытому файлу невозможен" Доступ к закрытому файлу невозможен
Подскажите пожалуйста в чём моя ошибка и подскажите как исправить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2016, 15:15
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Доступ к закрытому файлу невозможен (C#):

Доступ к закрытому файлу невозможен. iTextSharp - C#
Доброго дня. Возникла проблема с файлом и я не могу понять в чём соль. Такая фишка мне уже попадалась несколько раз, но я её каким-то...

Доступ к закрытому потоку невозможен - C#
Здравствуйте. есть функция , которая возвращает Stream. Когда я в переменную Stream заношу результат этой функции - далее не могу с ней...

Доступ к закрытому потоку невозможен - C#
Вылетает ошибка: "Доступ к закрытому потоку невозможен." MemoryStream _tempMem; _tempMem.Position = 0; string subject =...

Доступ к ликвидированному объекту невозможен - C#
Есть сервер на C# + клиент на C# + клиент на Java Android. Сервер асинхронный. Суть вот в чем: андройд должен отправлять данные на сервер...

Ошибка "Доступ к ликвидированному объекту невозможен" - C#
Ошибка "Доступ к ликвидированному объекту невозможен. Имя объекта: "Form"." в чем проблема не пойму

Многопоточный доступ к файлу - C#
видел, эта тема обсасывалась не раз на просторах сайберфорума, но никаких продвижений по этому поводу у меня не случилось... таки...

8
nedel
587 / 587 / 256
Регистрация: 09.04.2014
Сообщений: 1,390
Завершенные тесты: 1
23.11.2016, 15:43 #2
видимо у вы путаете свои переменные fs и fh, ну и fh должен быть открыт перед чтением
0
Sanya Black1993
2 / 0 / 1
Регистрация: 12.05.2012
Сообщений: 169
23.11.2016, 16:00  [ТС] #3
nedel, переменную поменял. Всё равно ошибка
Название: Снимок11.PNG
Просмотров: 51

Размер: 2.8 Кб
0
Sanya Black1993
2 / 0 / 1
Регистрация: 12.05.2012
Сообщений: 169
23.11.2016, 16:08  [ТС] #4
Вот код к кнопке открыть
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
    kolF = 0;
            IP = comboBox1.Text;
            Ping ping = new Ping();
            PingReply reply = ping.Send(IP);
            if (reply.Status != IPStatus.Success)
            {
                MessageBox.Show("Не удаётся подключиться!");
                button2.Enabled = false;
            }
            else {
                button2.Enabled = true;
                //Отправляем файл
                //Добавим на форму OpenFileDialog и вызовем его
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    try
                    {
                        // Получаем удаленный IP-адрес и создаем IPEndPoint
                        remoteIPAddress = IPAddress.Parse(IP);//"127.0.0.1");
                        endPoint = new IPEndPoint(remoteIPAddress, remotePort);
 
                        // Получаем путь файла и его размер (должен быть меньше 8kb)
                        fs = new FileStream(openFileDialog1.FileName.ToString(), FileMode.Open, FileAccess.Read);
                       // SendFileInfo(); // отправка информации о файле 111111
                        SystemBox.AppendText("Отправка файла размером " + fs.Length + " байт");
                        if (fs.Length > 8192) //если файл больше чем 8192 байта, то разбиваем для отправки частями
                        {
                            long _file_count;
                            //разбивка на части файла
                            //   using (FileStream _from_stream = Form1.fs)
                            //  {
                            long _file_length = 8000L;
                            _file_count = fs.Length / _file_length;
                            if (_file_length * _file_count < fs.Length) { _file_count = _file_count + 1; }
                            for (int i = 0; i < _file_count; i++)
                            {
                                using (FileStream _to_stream = new FileStream(string.Format("data/file_{0}.dat", i), FileMode.OpenOrCreate))
                                {
                                    long _byte_counter = _file_length;
                                    while (fs.CanRead && _byte_counter > 0)
                                    {
                                        _byte_counter--;
                                        _to_stream.WriteByte((byte)fs.ReadByte());
                                    }
                                    _to_stream.Close();
                                    //    SystemBox.AppendText("Разбивка файла ");
                                }
                            }
                            kolF = Convert.ToInt32(_file_count);
                            // продублировать на передачу файла< 8000 байт
                            //на приемную сторону передать число файлов
                            FileStream fs1 = new FileStream("data/data.txt", FileMode.OpenOrCreate, FileAccess.Write);
                            StreamWriter sw = new StreamWriter(fs1);
                            String filename = openFileDialog1.FileName.ToString();
                            sw.WriteLine(_file_count.ToString() + "/" + fs.Length.ToString() + "<" + Path.GetFileNameWithoutExtension(openFileDialog1.FileName) + "|" + filename.Substring(filename.LastIndexOf(".") + 1));
                            sw.Close();
                            SystemBox.AppendText("Файл будет передаваться " + _file_count.ToString() + " частями");
                            SendFile(fs1);
                        }
                        else
                        { //на приемную сторону передать число файлов
                            FileStream fs = new FileStream("data/data.txt", FileMode.OpenOrCreate, FileAccess.Write);
                            StreamWriter sw = new StreamWriter(fs);
                            String filename = openFileDialog1.FileName.ToString();
                            sw.WriteLine("1/" + fs.Length.ToString() + "<" + Path.GetFileNameWithoutExtension(openFileDialog1.FileName) + "|" + filename.Substring(filename.LastIndexOf(".") + 1));
                            sw.Close();
                            SendFile(fs);
                        }
                        
                    }
                    catch (Exception eR)
                    {
                        MessageBox.Show(eR.Message);
                    }
                }
            }
0
nedel
587 / 587 / 256
Регистрация: 09.04.2014
Сообщений: 1,390
Завершенные тесты: 1
23.11.2016, 16:09 #5
StreamWriter.Close:
Закрывает текущий StreamWriter объекта и основной поток.
Зачем FileStream? Если есть название файла то проще
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 private static void SendFile(string fileName)
        {
            Byte[] bytes = File.ReadAllBytes(fileName);
            try
            {
                // Отправляем файл
                sender.Send(bytes, bytes.Length, endPoint);
            }
            catch (Exception eR)
            {
                MessageBox.Show(eR.Message);
            }
            finally
            {
 
                sender.Close();
            }
        }
1
Sanya Black1993
2 / 0 / 1
Регистрация: 12.05.2012
Сообщений: 169
23.11.2016, 21:13  [ТС] #6
nedel, это исправил. Теперь на кнопку отправить вот код:
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
     progressBar1.Value = 0;
            System.IO.FileInfo file = new System.IO.FileInfo(openFileDialog1.FileName); //имя файла и информация о файле
              long size = file.Length;
            int size1 = unchecked((int)size);// передаёт размер файла
            //int val =size1/8000;
            if (kolF!=0)
            {
                // передача количества разбитых файлов
                     SendFile("data/data.txt");
                int b = kolF;
                int k=0;
                for (int i = 0; i < b; i++)
                {
                    kol_proc.Text = "отправлено 0%";
                    _to_stream1 = new FileStream("data/file_" + i.ToString() + ".dat", FileMode.Open, FileAccess.Read);
                    SendFile("data/file_" + i.ToString() + ".dat");   // отправка фрагмента файла
                    if (i == 0) { Thread.Sleep(5000); } else {Thread.Sleep(5000); } // задержка при передаче файла
                    _to_stream1.Close();
                    k = k + 8000;
                    progressBar1.Value = progressBar1.Value + ((8000/size1)*100);
                    kol_proc.Text = "отправлено "+progressBar1.Value.ToString()+"%";
                    }
 
            }
            else { // если файла нет в папке, передаём файлы целиком
                // Ждем 2 секунды
                Thread.Sleep(2000);
                // Отправляем сам файл
                SendFile(openFileDialog1.FileName);
                progressBar1.Value = 100;
                kol_proc.Text = "отправлено 100%";
                SystemBox.AppendText(" Файл успешно отправлен");
            }
Выдаёт такую ошибку.
Доступ к закрытому файлу невозможен
0
nedel
587 / 587 / 256
Регистрация: 09.04.2014
Сообщений: 1,390
Завершенные тесты: 1
24.11.2016, 13:18 #7
уберите sender.Close(); из SendFile, и закрывайте свой sender только тогда, когда он больше не будет нужен
1
Sanya Black1993
2 / 0 / 1
Регистрация: 12.05.2012
Сообщений: 169
24.11.2016, 15:00  [ТС] #8
nedel, проблему убрал вот так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 private static void SendFile(String fileName)
        {
            using (UdpClient sender = new UdpClient()) {
                // Создаем файловый поток и переводим его в байты
                Byte[] bytes = File.ReadAllBytes(fileName);
                try
                {
                    // Отправляем файл
                    sender.Send(bytes, bytes.Length, endPoint);
                }
                catch (Exception eR)
                {
                    MessageBox.Show(eR.Message);
                }
                finally
                {
                    // Закрываем соединение и очищаем поток
                    sender.Close();
                }
            }
        }
Теперь выдаёт ошибку на кнопку принятия файлов.
Вот код приёма файлов
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    public static void ReceiveFile(String put)
        {
            try
            {
                UdpClient receivingUdpClient = new UdpClient(localPort);
                // Получаем файл
                receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);
                // Создаем временный файл с полученным расширением
                fk = new FileStream(put, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);//"receiv/data."+fileDet.FILETYPE
                fk.Write(receiveBytes, 0, receiveBytes.Length);
            }
            catch (Exception eR)
            {
                MessageBox.Show(eR.Message);
            }
            finally
            {
                fk.Close();
                receivingUdpClient.Close();
            }
        }
Доступ к закрытому файлу невозможен
0
nedel
587 / 587 / 256
Регистрация: 09.04.2014
Сообщений: 1,390
Завершенные тесты: 1
24.11.2016, 16:33 #9
видимо localPort уже чем-то занят.
Не хочу вас расстраивать, но передавать файл через протокол UDP - это плохая идея, так как этот протокол не гарантирует ни того что даные будут доставлены в той же последовательности в которой были отправлены, ни того, будут ли они доставлены вообще.
0
24.11.2016, 16:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2016, 16:33
Привет! Вот еще темы с ответами:

Ограничен доступ к файлу - C#
Вставляю картинки в дата грид ваев. После чего некоторые необходимо переименовать. Однако это запрещено, т.к. мой файл используется. ...

Доступ к xml-файлу - C#
У меня есть переменная string fpath; //путь к файлу. Когда я хочу задать доступ к xml - файлу (тест.), то у меня ничего не выходит. ...

Закрыть доступ к файлу - C#
Читал про реализацию этого метода, но что-то у меня не выходит) Исправьте пожалуйста. Мне нужно чтоб по указанному пути программа закрывала...

Доступ к занятому файлу - C#
Возникла ещё одна проблема, теперь уже с удалением файла, который мы находим. Суть идеи такова: распаковываем архив, и создаем лист из...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru