Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
.NET 4.x

Отказано в доступе по пути при копировании файла

12.07.2015, 23:57. Показов 3720. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброй ночи!
Уже не выдерживаю, поэтому таки создаю тему.

Мне нужно скопировать файлы, но во время этой операции начисто зависает форма. Поэтому в качестве решения было взято использование BackgroundWorker для использования процесса копирования в новом потоке. Однако столкнулся с проблемой: вдруг откуда не возьмись, у меня не стало прав на доступ и выкидывает ошибку.

Исключение типа "System.UnauthorizedAccessException" возникло в mscorlib.dll, но не было обработано в коде пользователя

Дополнительные сведения: Отказано в доступе по пути "\100_01. Рабочий отвечает за панч и пространство.mp4".


Код для копирования взят из ФАКа:
VB.NET
1
IO.File.Copy()
и прекрасно работает из формы. Но при попытке использования из другого потока говорит, что нет прав.
То есть получается, что форма имеет права, а этот новый поток уже не имеет.
Как сделать чтобы все работало?

Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.07.2015, 23:57
Ответы с готовыми решениями:

Отказано в доступе по пути при удалении файла
Я просто не понимаю. Извиняюсь что спрашиваю очевидное, но прошу помощи. Есть програма, которая должна просканировать компьютер на...

При компиляции пишет отказано в доступе к пути файла h
Надо перезаписать f1 в f2 и наоборот используя промежуточный фаил h. При компиляции пишет отказано в доступе к пути файда h. Что не так? ...

Отказано в доступе при копировании директорий
Добрый день! Написал программулину для быстрого копирования папки на флешку, в один клик так сказать )) Но почему-то многие файлы не...

15
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18234 / 14148 / 5366
Регистрация: 17.03.2014
Сообщений: 28,840
Записей в блоге: 1
13.07.2015, 17:37
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Stass48, путь "\100_01. Рабочий отвечает за панч и пространство.mp4" является неправильным - отсюда и исключение.
1
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
13.07.2015, 17:49
Цитата Сообщение от Stass48 Посмотреть сообщение
Рабочий отвечает за панч и пространство
Напахнуло курсами по сведению и мастерингу. Интересно, Clap можно считать рабочим?)

Stass48, странно, что исключение было выброшено со слешем в начале пути. OwenGlendower, видимо, об этом толкует
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18234 / 14148 / 5366
Регистрация: 17.03.2014
Сообщений: 28,840
Записей в блоге: 1
13.07.2015, 17:50
Цитата Сообщение от Памирыч Посмотреть сообщение
странно, что исключение было выброшено со слешем в начале пути. OwenGlendower, видимо, об этом толкует
Так точно.
0
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
13.07.2015, 18:01  [ТС]
Да как же так?

Вот код:

VB.NET
1
IO.File.Copy(Me.dgv_PlaylistCtl.Rows(i).Cells(3).Value, frm_Params.TargetFolderPath & "\" & Number & "_" & Me.dgv_PlaylistCtl.Rows(i).Cells(1).Value)
Не могу выделить тегом "код" пишу с планшета. В ячейках датагрид хранится путь откуда взять файл. В переменной TargetFolderPath хранится путь к папке назначения. Эта строка находится в цикле For и из потока формы, ну, то есть из процедуры клика по кнопке, работает и все копирует, но только форма зависает. Там ведь работает!
Почему же с бэкграунд-воркера не хочет? Переменная TargetFolderPath - глобальная и к ней я получаю доступ тоже правильно. Так в чем же вся соль?

P. S.: Clap в некоторых стилях (а в некоторых - нет) и есть - рабочий) если сделать его широким, то и весь трек тогда кажется широким. Только поосторожнее с антифазой))
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18234 / 14148 / 5366
Регистрация: 17.03.2014
Сообщений: 28,840
Записей в блоге: 1
13.07.2015, 18:07
Stass48, ищи где меняется frm_Params.TargetFolderPath после запуска BackgroundWorker. Потому что текст исключения явно свидетельствует что эта переменная пустая.

Не по теме:

Цитата Сообщение от Stass48 Посмотреть сообщение
Не могу выделить тегом "код" пишу с планшета.
Это как-то мешает набрать тег VBNET? :)

0
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
13.07.2015, 18:57  [ТС]
Намек на то, чтобы я проверил переменную TargetFolderPath.. Я понимаю... Ща проверю, но мне кажется почему-то что проблема не в пути.
На сайте мелкософта пишут о понятиях безопасного и небезопасного кода... Типа если он не выходит за некоторые границы в памяти, то безопасный и все хорошо, а если выходит, то система считает его небезопасным и отказывается выполнять. Здесь же новый поток все таки. Хрен его знает, может он и выходит за эти границы памяти...

Добавлено через 40 минут
Короче, держитесь за стулья, господа.
1) Переменная НЕ ПУСТАЯ это факт (жму на кнопку, в коде кнопки прописал мсгбокс с выводом содержимого переменной, отображает путь, все правильно!)
2) Но при чтении из процедуры воркера DoWork она почему-то оказывается пустой!
3) Я сначала хотел вывести из воркера полный путь в ричтекстбокс на форме, но снова ошибка! Нельзя взаимодействовать с объектами формы из нового потока! Пришлось выводить при помощи мсг-бокса.

Итого:
Внутри воркера (внутри DoWork):
1) Видите ли, считать данные с ячейки датагрид мы можем
2) А считать данные с переменной мы НЕ можем
3) В то время как вывести текст в ричтекст-бокс мы тоже не можем!)) (хотя читать с датагрид можем, а написано было в ошибке с ричтекст-боксом что мы вообще к объектам формы доступа не имеем)

Вот таки пироги.

Добавлено через 6 минут
Здесь не пустая:
VB.NET
1
2
3
4
5
6
7
8
9
Private Sub btn_Do_Click(sender As Object, e As EventArgs) Handles btn_Do.Click
        If IO.Directory.Exists(frm_Params.TargetFolderPath) = True And frm_Params.Limit = False And frm_Params.InjectFiles = False Then
            If BackgroundWorker.IsBusy <> True Then
                Me.btn_Cancel.Enabled = True
                MsgBox(frm_Params.TargetFolderPath)
                BackgroundWorker.RunWorkerAsync()
            End If
        End If
    End Sub
Здесь пустая:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub BackgroundWorker_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork
        Dim Worker As System.ComponentModel.BackgroundWorker = CType(sender, System.ComponentModel.BackgroundWorker)
        Dim Number As Integer = 100
        Dim AllRows As Integer = Me.dgv_PlaylistCtl.RowCount
        Dim ProgressStep As Integer = 100 \ AllRows
        Dim Ostatok As Integer = 100 Mod AllRows
        Me.ProgressBar.Value = 0
        For i As Integer = 0 To AllRows - 1 Step 1
            If (Worker.CancellationPending = True) Then
                e.Cancel = True
                Exit For
            Else
                MsgBox(frm_Params.TargetFolderPath & "\" & Number & "_" & Me.dgv_PlaylistCtl.Rows(i).Cells(1).Value)
                Number = Number + 1
                Worker.ReportProgress(Me.ProgressBar.Value + ProgressStep)
                If 100 - Me.ProgressBar.Value = Ostatok Then Worker.ReportProgress(100)
            End If
        Next i
    End Sub
Вот так вообще ошибка-исключение:
Исключение типа "System.InvalidOperationException" возникло в System.Windows.Forms.dll, но не было обработано в коде пользователя

Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'RichTextBox1' не из того потока, в котором он был создан.


VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private Sub BackgroundWorker_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork
        Dim Worker As System.ComponentModel.BackgroundWorker = CType(sender, System.ComponentModel.BackgroundWorker)
        Dim Number As Integer = 100
        Dim AllRows As Integer = Me.dgv_PlaylistCtl.RowCount
        Dim ProgressStep As Integer = 100 \ AllRows
        Dim Ostatok As Integer = 100 Mod AllRows
        Me.ProgressBar.Value = 0
        For i As Integer = 0 To AllRows - 1 Step 1
            If (Worker.CancellationPending = True) Then
                e.Cancel = True
                Exit For
            Else
                Me.RichTextBox1.Text = frm_Params.TargetFolderPath & "\" & Number & "_" & Me.dgv_PlaylistCtl.Rows(i).Cells(1).Value
                Number = Number + 1
                Worker.ReportProgress(Me.ProgressBar.Value + ProgressStep)
                If 100 - Me.ProgressBar.Value = Ostatok Then Worker.ReportProgress(100)
            End If
        Next i
    End Sub
0
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
13.07.2015, 19:05
Цитата Сообщение от Stass48 Посмотреть сообщение
попытка доступа к элементу управления 'RichTextBox1' не из того потока, в котором он был создан
Временное решение: запускать скомпилированный экзешник.

Забавы для собрал проект
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
    Dim S As String = "Str"
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        DataGridView1.Rows.Add()
        DataGridView1(0, 0).Value = "Value"
        BackgroundWorker1.RunWorkerAsync()
    End Sub
 
    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        For I As Integer = 0 To 100
            Me.Text = S & " " & RichTextBox1.Text & " " & DataGridView1(0, 0).Value & " |" & I
            System.Threading.Thread.Sleep(300)
        Next
    End Sub
В заголовок формы попали значение обычной переменной, текста из рича и ячейки грида
Название: Скриншот.jpg
Просмотров: 132

Размер: 43.5 Кб
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18234 / 14148 / 5366
Регистрация: 17.03.2014
Сообщений: 28,840
Записей в блоге: 1
13.07.2015, 19:13
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Stass48, что из себя представляет переменная frm_Params и её поле TargetFolderPath? Это сдучайно не другая уже закрытая форма?

Я бы переписал код по другому и передал аргументы BackgroundWorker-y явно:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Imports System.IO
Imports System.ComponentModel
 
Private Sub btn_Do_Click(sender As Object, e As EventArgs) Handles btn_Do.Click
    If Directory.Exists(frm_Params.TargetFolderPath) AndAlso Not frm_Params.Limit AndAlso Not frm_Params.InjectFiles Then
        If Not BackgroundWorker.IsBusy Then
            Me.btn_Cancel.Enabled = True
            BackgroundWorker.RunWorkerAsync(frm_Params.TargetFolderPath)
        End If
    End If
End Sub
 
Private Sub BackgroundWorker_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork
    Dim Worker As BackgroundWorker = DirectCast(sender, BackgroundWorker)
    Dim TargetFolderPath As String = DirectCast(e.Argument, String)
    
    ' Дальше без изменений. Только работаем с локальной переменной TargetFolderPath вместо frm_Params.TargetFolderPath
End Sub
Цитата Сообщение от Stass48 Посмотреть сообщение
Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'RichTextBox1' не из того потока, в котором он был создан.
Все правильно. Надо использовать метод Invoke или менять элементы управления в событии ProgressChanged.
0
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
13.07.2015, 19:30  [ТС]
Да, действительно в ричтекстбокс выводит если запускать отдельно от компилятора. Но проблему с переменной это не решает, увы.

Добавлено через 2 минуты
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Stass48, что из себя представляет переменная frm_Params и её поле TargetFolderPath? Это сдучайно не другая уже закрытая форма?
Да, frm_Params это форма, которая закрыта. В ней как раз и присваивается путь в переменную TargetFolderPath (которая As String), потом конечно юзер закрывает окно параметров программы.

Добавлено через 13 минут
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Dim Worker As BackgroundWorker = DirectCast(sender, BackgroundWorker)
А зачем эта строка?

И неужели вот это только так персонально надо переменные ему преподносить "на блюдечке"? Почему он считывает без проблем данные с объектов на форме, но не с переменных?

Я вообще уже жалею что с этим воркером связался... Так это у меня простой код в этом варианте выставленных параметров.. У меня еще впереди инъекии видеофайлов с интервалом... Во *** .. Чувствую что это будет настоящая *о*а........
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18234 / 14148 / 5366
Регистрация: 17.03.2014
Сообщений: 28,840
Записей в блоге: 1
13.07.2015, 19:32
Цитата Сообщение от Stass48 Посмотреть сообщение
Да, frm_Params это форма, которая закрыта.
Вот мы и нашли причину проблемы. VB.NET похоже объявляет переменные для форм как ThreadStatic. То есть они привязываются к тому потоку где были созданы. Т.к. код обработчика DoWork выполняется в ThreadPool потоке, а не UI потоке, то переменная frm_Params инциализируется новым экземпляром frm_Params и поле TargetFolderPath получает значение Nothing.

Что касается исправления ошибки, то смотри пример выше.

Цитата Сообщение от Stass48 Посмотреть сообщение
В ней как раз и присваивается путь в переменную TargetFolderPath (которая As String), потом конечно юзер закрывает окно параметров программы.
Не надо так делать. Настройки следует хранить в отдельном классе.
0
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
13.07.2015, 19:38  [ТС]
Переменная TargetFolderPath объявлена как Friend... Если ее повысить до Public, это не решит проблему?
Ну это ж пипец просто так все усложнять ради блин чтобы форма не висла... мда...

Добавлено через 1 минуту
Паблик вроде открывает доступ другим приложениям к объявленной переменной...
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18234 / 14148 / 5366
Регистрация: 17.03.2014
Сообщений: 28,840
Записей в блоге: 1
13.07.2015, 20:05
Цитата Сообщение от Stass48 Посмотреть сообщение
Dim Worker As BackgroundWorker = DirectCast(sender, BackgroundWorker)
А зачем эта строка?
У тебя была ровно такая же строка. Я только заменил CType на DirectCast и убрал пространство имен. Возможно ты имел в виду эту строку?
VB.NET
1
Dim TargetFolderPath As String = DirectCast(e.Argument, String)
Если да, то это один из способов передачи данных в BW. Так можно передавать как элементарные значения вроде строк так и классы. Удобство этого способа в том что мы уменьшаем кол-во внешних зависимостей для метода что обычно приводит к более простому коду.

Цитата Сообщение от Stass48 Посмотреть сообщение
И неужели вот это только так персонально надо переменные ему преподносить "на блюдечке"? Почему он считывает без проблем данные с объектов на форме, но не с переменных?
Не обязательно. Если бы ты обращался к полям формы в которой расположен BW через Me, то проблемы не было бы. Так как ты обращаешься к уже закрытой форме, делая это через неявно объявленную переменную, то проблема имеет место быть.

Цитата Сообщение от Stass48 Посмотреть сообщение
Переменная TargetFolderPath объявлена как Friend... Если ее повысить до Public, это не решит проблему?
Нет. Проблема не в переменной, а в том как VB.NET работает с формами при доступе через неявно создаваемые переменные. Ты же в курсе что к любой форме в VB.NET можно обратиться используя имя класса? Это та самая неявная переменная. Если ты ей пользуешься то неплохо понимать как это работает в многопоточном приложении. Для каждого потока будет создана своя форма и отсюда и проблема.

Цитата Сообщение от Stass48 Посмотреть сообщение
Паблик вроде открывает доступ другим приложениям к объявленной переменной...
Public делает член типа доступным из всех классов из любой сборки. Сборка это не тоже самое что приложение.

P.S. Уже не в первый раз сталкиваюсь с тем что программсты на VB.NET плохо понимают его возможности. Это неплохой язык и Application Framework дает ряд удобных инструментов. Однако любым инструментом нужно уметь пользоваться. Не будьте программистами в стиле карго-культа - вникайте до конца в непонятные ситуации.
0
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
14.07.2015, 16:43  [ТС]
Хм. Вы правы. Спасибо. Философски подошли к моей проблеме. Я разобрался в примере использования воркера только "на пальцах". Но не полностью, поэтому была ли там та строка у меня в коде или нет, я не знаю сам и не узнаю пока не открою свой код. Вот Вы сказали что из Me можно взять что угодно, а уже из класса посторонней формы - нельзя... Ну хорошо.
Что если просто объявить ту же самую переменную, но только не в той форме, а в этой. Тогда обращаться к переменной можно будет уже не frm_Params.TargetFolderPath, а через Me.TargetFolderPath или вообще без Me. Но в то же время ничто не мешает записать в эту переменную данные из формы frm_Params, обратившись к ней через frm_Main.TargetFolderPath.
Если не гора идет к Магомету...

Добавлено через 18 часов 30 минут
Проблему решил объявлением переменной в той же форме, где находится сам BackgroundWorker. То есть просто перенес объявление этой переменной из другой формы в эту.
Это гораздо проще для меня, чем добавлять в код еще какие-то (покаместь не понятные для меня) строки или изменения. Нет пока что желания лезть в дебри.

Всем спасибо! Вопрос решен.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18234 / 14148 / 5366
Регистрация: 17.03.2014
Сообщений: 28,840
Записей в блоге: 1
14.07.2015, 16:47
Stass48, тебе виднее как лучше, но советую все таки использовать это решение. Дублируя переменные ты запутываешь код.
0
22 / 22 / 7
Регистрация: 26.05.2011
Сообщений: 256
14.07.2015, 17:27  [ТС]
Я не против, просто пока не понимаю, как это работает, точнее конкретно значение Вашей той строки понимаю, но если мне скажут, переделай это все под 10 переменных, я этого не сделаю. Вот в этом и проблема.
Потому то и выбрал решение именно такое, чтобы не быть программистом карго-культа и делать все осознано, к тому же, переменную я не дублировал, а просто перенес ее объявление в ту форму, где находится воркер. А положить в нее значение из под другой формы не составляет труда и все работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.07.2015, 17:27
Помогаю со студенческими работами здесь

Отказано в доступе по пути на удаление файла
Возникла проблема с правами на удаление jpg файлов из папки на рабочем столе, пишет &quot;отказано в доступе по пути&quot;: string...

Отказано в доступе по пути при сохранении документа в заданную папку
Нужно: Формирующийся документ сохранять в определенную папку без дефолтного showDialog (на пример на диск D ). Но, при попытке указать...

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

Отказано в доступе по пути
в asp.net средство администрирования веб-узла в разделе безопасность выдаёт ошибку помогите исправить Возникла проблема с...

Отказано в доступе по пути
Я прочитал кучу разных тем, но подходящего решения не нашел. Хочу поменять тэги mp3 файлов. string dir =...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru