Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
8 / 8 / 0
Регистрация: 09.02.2012
Сообщений: 41
1

Запись в файл - проверить, не идет ли в него запись, чтобы не генерировалось исключение

09.02.2012, 12:59. Просмотров 1989. Ответов 4
Метки нет (Все метки)

Доброе время суток!

Вот такой пример:

vb.net
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
Imports System
Imports System.IO
 
 
Module Module1
    Public Class LogWriter
        Dim LogString As String
 
        Public Sub New()
        End Sub
 
        Public Sub Write(ByVal StringToLog As String)
            LogString = StringToLog
            'Line:
            Try
                Dim sw As StreamWriter = File.AppendText(My.Application.Info.DirectoryPath & "\error.log")
                sw.WriteLine("{0} {1} {2}", DateTime.Now.ToShortDateString(), DateTime.Now.ToLongTimeString(), LogString)
                sw.Flush()
            Catch ex As IOException
                Console.WriteLine("ОШИБКА: - " & ex.Message)
                'GoTo Line
            End Try
        End Sub
    End Class
 
 
    Sub Main()
        Dim lw As New LogWriter()
 
        For i As Integer = 0 To 9
            lw.Write("Error")
        Next
 
    End Sub
 
End Module

Хочется избежать исключения, связанного только с совместным доступом. Если комментированные строки включить, то конечно работает, но мне кажется, что это не верный подход. Есть ли какой либо метод проверки на доступность для записи? Т.е. не пишет ли кто в файл, дождаться и когда файл свободе - записать.

Спасибо.

Добавлено через 1 час 43 минуты
Частично отвечаю сам:

Достаточно строку

vb.net
1
sw.Flush()
заменить на
vb.net
1
sw.Dispose()
В одном потоке все работает корректно. Но при нескольких потоках, когда каждый поток отдельно пытается писать: снова ошибка доступа.

Т.о. остается вопрос: как все исправить для многопоточного случая

Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2012, 12:59
Ответы с готовыми решениями:

Файл создается, но в него не идет запись
Всем привет! Делаю запись в файл! Если файл не создан, то нам нужно сначала его создать а потом...

Не идет запись в файл
Простенькая задачка: ввести число n c клавиатуры, и вывести в файл n чисел вида: {2}^{i+1} Мое...

Не идёт запись в файл
Нужно равные части из одного файла записать в новые созданные файлы. Есть файл со стихом из 28...

Не идет запись в файл
Смысл проблемы в том, что не идет запись в 3.txt и 4.txt. Но если запускать convertation, как...

4
_
2359 / 1232 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
09.02.2012, 13:06 2
Stas43, после sw.Flush() поставьте sw.Close(), а после него можно и sw.Dispose()
в многопоточном случае вам надо ставить мониторы вокруг операции записи
это делается примерно так
vb.net
1
2
3
4
5
6
7
8
9
Monitor.Enter(randObj)
            logStream = New StreamWriter("Server.log", True)
            logStream.WriteLine(Date.Now.ToString())
            logStream.WriteLine("Connected to {0}", sockets.RemoteEndPoint)
            logStream.WriteLine("Requested path {0}", request)
            logStream.WriteLine("Total bytes {0}", erMesLen)
            logStream.Flush()
            logStream.Close()
            Monitor.Exit(randObj)
где randObj - это объект определенный на уровне класса
vb.net
1
Dim randObj As New Object()
0
8 / 8 / 0
Регистрация: 09.02.2012
Сообщений: 41
09.02.2012, 13:34  [ТС] 3
Цитата Сообщение от Eugene22 Посмотреть сообщение
Stas43, после sw.Flush() поставьте sw.Close(), а после него можно и sw.Dispose()
в многопоточном случае вам надо ставить мониторы вокруг операции записи
это делается примерно так
vb.net
1
2
3
4
5
6
7
8
9
Monitor.Enter(randObj)
            logStream = New StreamWriter("Server.log", True)
            logStream.WriteLine(Date.Now.ToString())
            logStream.WriteLine("Connected to {0}", sockets.RemoteEndPoint)
            logStream.WriteLine("Requested path {0}", request)
            logStream.WriteLine("Total bytes {0}", erMesLen)
            logStream.Flush()
            logStream.Close()
            Monitor.Exit(randObj)
где randObj - это объект определенный на уровне класса
vb.net
1
Dim randObj As New Object()
Не получилось Все равно ошибка. Вот полный код для теста:

vb.net
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
Imports System
Imports System.IO
Imports System.Threading
 
Module Module1
    Public Class LogWriter
        Dim LogString As String
        Dim randObj As New Object()
 
        Public Sub New()
        End Sub
 
        Public Sub Write(ByVal StringToLog As String)
            LogString = StringToLog
 
            Try
                Monitor.Enter(randObj)
                Dim sw As StreamWriter = File.AppendText(My.Application.Info.DirectoryPath & "\error.log")
                sw.WriteLine("{0} {1} {2}", DateTime.Now.ToShortDateString(), DateTime.Now.ToLongTimeString(), LogString)
                sw.Flush()
                sw.Close()
                Monitor.Exit(randObj)
            Catch ex As IOException
                Console.WriteLine("ОШИБКА: - " & ex.Message)
            End Try
        End Sub
    End Class
 
    Sub Main()
        Dim Thread_1 As Threading.Thread
        Dim Thread_2 As Threading.Thread
 
        Thread_1 = New Threading.Thread(AddressOf WriteThread_1)
        Thread_1.Name = "Thread_1"
        Thread_1.Start()
 
        Thread_2 = New Threading.Thread(AddressOf WriteThread_2)
        Thread_2.Name = "Thread_2"
        Thread_2.Start()
 
    End Sub
    Sub WriteThread_1()
        Dim lw As New LogWriter()
        For i As Integer = 0 To 100
            lw.Write(Thread.CurrentThread.Name & " - Error")
        Next
 
    End Sub
 
    Sub WriteThread_2()
        Dim lw As New LogWriter()
 
        For i As Integer = 0 To 100
            lw.Write(Thread.CurrentThread.Name & " - Error")
        Next
 
    End Sub
 
End Module
0
_
2359 / 1232 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
09.02.2012, 14:12 4
Stas43, ты неправильно сделал, надо примерно так
vb.net
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
Imports System
Imports System.IO
Imports System.Threading
Module Module1
 
    Dim myWriter As New LogWriter()
    Sub Main()
        Dim Thread_1 As Threading.Thread
        Dim Thread_2 As Threading.Thread
 
        Thread_1 = New Threading.Thread(AddressOf myWriter.WriteThread_1)
        Thread_1.Name = "Thread_1"
        Thread_1.Start()
 
        Thread_2 = New Threading.Thread(AddressOf myWriter.WriteThread_2)
        Thread_2.Name = "Thread_2"
        Thread_2.Start()
    End Sub
 
    Public Class LogWriter
        Dim LogString As String
        Dim randObj As New Object()
 
        Sub New()
            
        End Sub
 
        Public Sub Write(ByVal StringToLog As String)
            LogString = StringToLog
 
            Try
                Monitor.Enter(randObj)
                Dim sw As StreamWriter = File.AppendText(My.Application.Info.DirectoryPath & "\error.log")
                sw.WriteLine("{0} {1} {2}", DateTime.Now.ToShortDateString(), DateTime.Now.ToLongTimeString(), LogString)
                sw.Flush()
                sw.Close()
                Monitor.Exit(randObj)
            Catch ex As IOException
                Console.WriteLine("ОШИБКА: - " & ex.Message)
            End Try
        End Sub
 
        Sub WriteThread_1()
            For i As Integer = 0 To 100
                Write(Thread.CurrentThread.Name & " - Error")
            Next
        End Sub
 
        Sub WriteThread_2()
            For i As Integer = 0 To 100
                Write(Thread.CurrentThread.Name & " - Error")
            Next
        End Sub
    End Class
 
End Module
1
8 / 8 / 0
Регистрация: 09.02.2012
Сообщений: 41
09.02.2012, 14:33  [ТС] 5
СПАСИБО!!!
Все работает!!!!!!!!!!

И попутно: если поток будет отдельным классом, то myWriter мне достаточно однократно на самом верху объявить?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2012, 14:33

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Не идёт запись в текстовый файл
F q всем живым.Тут я из файла инпут читаю матрицу,беру оттуда строки по возрастанию,суну их в mas и...

Запись в файл Чтение не идет
Язык Си в Linux. Создаю файл по чтению и записи. Записываю в него целое число. Пытаюсь прочитать...

Не идёт запись в txt файл
Доброго времени суток ! вот такая задачка : using System; using System.IO; class Header {...

Не идёт запись в txt файл
Не идет запись в файл. Файл даже не создается, использовал базовые примеры MSDN такие как...


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

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

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