Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Поиск в TStream / 18 сообщений из 18, страница 1 из 1
03.12.2012, 17:56
    #38063117
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в TStream
Доброго дня господа !

Как Stream найти в Streamе (код бросьте пожалуйста)
Framework 3.5

Типа InStr('hhh','ggghhhkkk')>0

Спасибо ....
...
Рейтинг: 0 / 0
03.12.2012, 18:43
    #38063222
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в TStream
HOME_X,

ты хотел сказать "как найти string в stream"? Оберни Stream в StreamReader, читай построчно из него с помощью метода ReadLine() и проверяй есть ли в ней нужная тебе подстрока. Только не с помощью InStr, а с помощью метода String.Contains().
...
Рейтинг: 0 / 0
03.12.2012, 19:39
    #38063307
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в TStream
bazileHOME_X,

ты хотел сказать "как найти string в stream"? Оберни Stream в StreamReader, читай построчно из него с помощью метода ReadLine() и проверяй есть ли в ней нужная тебе подстрока. Только не с помощью InStr, а с помощью метода String.Contains().

В целом можно так .... а стандартный VB функций нету ?
Хотелось бы конечно по STREAMу организовать поиск
...
Рейтинг: 0 / 0
04.12.2012, 00:01
    #38063531
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в TStream
HOME_XВ целом можно так .... а стандартный VB функций нету ?
Хотелось бы конечно по STREAMу организовать поиск
Базовая библиотека не обязана на каждый чих предоставлять специальную функцию. Нужна функция поиска в потоке - возьми и напиши. Кроме того, если ты хочешь стать хорошим специалистом по .NET, то забудь про VB функции, пользуйся функциями из BCL.
...
Рейтинг: 0 / 0
04.12.2012, 17:31
    #38064777
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в TStream
bazile,

Да понимаешь не хотелось заниматься отсебятиной
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
        Private Function ExecAttachments(ByVal List As System.IO.Stream) As Boolean
            Dim Si As String = "O" & vbNullChar & "b" & vbNullChar & "j" & vbNullChar & "I" & vbNullChar & "n" & vbNullChar & "f" & vbNullChar & "o"
            Dim Sr As New System.IO.StreamReader(List)
            Do
                ExecAttachments = Sr.ReadLine.Contains(Si)
            Loop Until Sr.Peek() = -1 Or ExecAttachments
            Sr.Close()
            Sr = Nothing
        End Function
...
Рейтинг: 0 / 0
04.12.2012, 19:08
    #38064949
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в TStream
HOME_X,

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

В целом код подозрительный. Зачем ты в строку вставляешь нулевые символы? Такое подозрение что ты работаешь с файлом в кодировке utf-16 и делаешь это неправильно. Попробуй такой вариант:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Imports System.IO
Imports System.Text
...
Private Function IsExecAttachments(ByVal sourceStream As Stream) As Boolean
	Const Si As String = "ObjInfo"
	Using sr As New StreamReader(sourceStream, Encoding.GetEncoding("UTF-16"))
		Do
			IsExecAttachments = Sr.ReadLine.Contains(Si)
		Loop Until sr.EndOfStream Or ExecAttachments
	End Using
End Function


Обрати внимание что я переименовал функцию так функция не "выполняет аттачмент", а только проверяет наличие определенного признака внутри потока.

Кроме этого возможно имеет смысл переписать функцию так чтобы позиция в потоке не менялась после ее исполнения:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Imports System.IO
Imports System.Text
...
Private Function IsExecAttachments(ByVal sourceStream As Stream) As Boolean
	Const Si As String = "ObjInfo"
	Dim prevPosition As Long = sourceStream.Position
	
	Using sr As New StreamReader(sourceStream, Encoding.GetEncoding("UTF-16"))
		Do
			IsExecAttachments = Sr.ReadLine.Contains(Si)
		Loop Until sr.EndOfStream Or ExecAttachments
	End Using
	
	sourceStream.Position = prevPosition
End Function
...
Рейтинг: 0 / 0
05.12.2012, 13:05
    #38066072
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в TStream
bazileЗачем ты в строку вставляешь нулевые символы?
Такое подозрение что ты работаешь с файлом в кодировке utf-16 и делаешь это неправильно.


Задача - найти в DOC файле вложения
(WORD-->Вставка-->Объект-->Создание из файла ....)
не активизируя приложение WORD !!!!!
Ключом для поиска - есть слово O b j I n f o




bazileпозиция в потоке не менялась после ее исполнения

Принято !
...
Рейтинг: 0 / 0
05.12.2012, 13:16
    #38066105
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в TStream
bazile Const Si As String = "ObjInfo"
Using sr As New StreamReader(sourceStream, Encoding.GetEncoding("UTF-16"))


Работает ....!
Спасибо за подсказку
...
Рейтинг: 0 / 0
05.12.2012, 17:12
    #38066655
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в TStream
HOME_X,

А нельзя ли организовать поиск Byte по Byte
У меня организован цикл перегрузки потока, хотелось бы без StreamReader
Код: vbnet
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.
                Dim S As String = "ObjInfo"
                Dim Find As Byte() = New Byte(S.Length) {}
                System.Buffer.BlockCopy(S.ToCharArray(), 0, Find, 0, Find.Length)

                Do While (rdData.Read)
                        ..............................
                        ..............................
                        ............................. 
                        Dim I, J As Integer
                        J = 0
                        Dim Buffer As Byte() = New Byte(32767) {}
                        Do
                            I = rdData.GetBytes(3, J, Buffer, 0, Buffer.Length)

                            Key=Buffer.Contains(Find) -  

                            т.е. без доп. цикла искать 
                            при перегрузке данных
                            из поля базы данных в файл.

                            fsList.Write(Buffer, 0, I)
                            J = J + I
                        Loop Until (I = 0)


                Loop



Cпасибо
...
Рейтинг: 0 / 0
05.12.2012, 17:32
    #38066698
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в TStream
HOME_X,

можно. Для этого тебе нужно получить последовательность байтов для строки в нужной кодировке (см. класс Encoding и его метод GetBytes()), затем написать поиск этих байтов в потоке не забывая, что искомая последовательность может попасть на границу буфера.
...
Рейтинг: 0 / 0
05.12.2012, 18:00
    #38066765
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в TStream
bazileзатем написать поиск этих байтов в потоке не забывая, что искомая последовательность может попасть на границу буфера.


Здесь не понял (чем именно организовать) - можно пример
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
                Dim Key As Boolean = False
                Dim CodeSheet As System.Text.Encoding = System.Text.Encoding.Unicode
                Dim FindBytes As Byte() = CodeSheet.GetBytes("ObjInfo")

                Do While (rdData.Read)
                    If Not rdData.IsDBNull(3) Then
                        Main = New System.IO.MemoryStream
                        Dim I, J As Integer
                        J = 0
                        Dim Buffer As Byte() = New Byte(32768 - 1) {}
                        Do
                            I = rdData.GetBytes(3, J, Buffer, 0, Buffer.Length)
                            Key = Buffer.Contains(FindBytes) ??????????????
                            Main.Write(Buffer, 0, I)
                            J = J + I
                        Loop Until (I = 0)
                        Main.Close()
                    End If
                Loop
 
...
Рейтинг: 0 / 0
05.12.2012, 18:07
    #38066776
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в TStream
bazileHOME_X,
искомая последовательность может попасть на границу буфера.


Согласен - малость гемор может получиться .....!!!!
нужно держать старый и новый буфер
...
Рейтинг: 0 / 0
06.12.2012, 13:39
    #38067907
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в TStream
HOME_XЗдесь не понял (чем именно организовать) - можно пример


Цикл воротить не хочеться- может есть системная функция ?
...
Рейтинг: 0 / 0
06.12.2012, 14:01
    #38067947
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в TStream
HOME_XЦикл воротить не хочеться- может есть системная функция ?
Системная функцию делающая что?
...
Рейтинг: 0 / 0
06.12.2012, 14:24
    #38067991
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в TStream
bazileHOME_X,
поиск этих байтов в потоке


Или писать самостоятельно ?
...
Рейтинг: 0 / 0
06.12.2012, 14:40
    #38068030
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в TStream
HOME_Xпоиск этих байтов в потоке
...
Или писать самостоятельно ?
Такой функции нет. Напиши сам.
...
Рейтинг: 0 / 0
11.12.2012, 13:00
    #38073991
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в TStream
bazileТакой функции нет. Напиши сам.


Принято !
Спасибо - изобразил ...

Еще момент - можно ли избежать дублирования процесса
Алгоритм работы такой
1. Выполнение запроса
2. Копирование в временной стреам
3. Во время копирования идет проверка на наличие символов (IsFind=True)
4. Если IsFind=True - создаем указатель на файл по одному пути
IsFind=False - создаем указатель на файл по другому пути
5. Копирование временного стреама в файловый стреам (это пункт хотелось бы избежать)
Код: vbnet
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.
                cnBase = New SqlConnection
                cnBase.ConnectionString = sCon
                cnBase.Open()
                rcSqls = New SqlCommand
                rcSqls.Connection = cnBase
                rcSqls.CommandText = sSql
                rdData = rcSqls.ExecuteReader()
                Do While (rdData.Read)
                    If Not rdData.IsDBNull(3) Then
                        Main = New System.IO.MemoryStream
                        J = 0
                        IsFind = False
                        S = Find.Length
                        Do
                            I = rdData.GetBytes(3, J, Buffer, 0, Buffer.Length)
                            Main.Write(Buffer, IIf(J = 0, 0, S), IIf(J = 0, I, I - S))
                            J = J + I - S
                            F = 0
                            Do While F < UBound(Buffer) - S And Not IsFind
                                IsFind = Buffer(F + 0) = Find(0) And Buffer(F + 1) = Find(1) And _
                                         Buffer(F + 2) = Find(2) And Buffer(F + 3) = Find(3) And _
                                         Buffer(F + 4) = Find(4) And Buffer(F + 5) = Find(5) And _
                                         Buffer(F + 6) = Find(6) And Buffer(F + 7) = Find(7) And _
                                         Buffer(F + 8) = Find(8) And Buffer(F + 9) = Find(9) And _
                                         Buffer(F + 10) = Find(10) And Buffer(F + 11) = Find(11) And _
                                         Buffer(F + 12) = Find(12) And Buffer(F + 13) = Find(13)
                                F = F + 1
                            Loop
                        Loop Until (I = S)
                        If Dir(sDir & rdData.GetString(0), FileAttribute.Directory) = "" Then MkDir(sDir & rdData.GetString(0))
                        If Dir(sDir & "ERROR\" & rdData.GetString(0), FileAttribute.Directory) = "" And (InStr(My.Resources.Ext, rdData.GetString(2) & ",") = 0 Or IsFind) Then MkDir(sDir & "ERROR\" & rdData.GetString(0))
                        fsList = System.IO.File.Create(sDir & IIf(InStr(My.Resources.Ext, rdData.GetString(2) & ",") = 0 Or IsFind, "ERROR\", "") & rdData.GetString(0) & "\" & rdData.GetString(1))
                        CopyStream(Main, fsList)   - лишнее копирование 
                        fsList.Close()
                        Main.Close()
                    End If
                Loop



CopyStream(Main, fsList) - лишнее копирование хотелось бы избежать

Спасибо ....
...
Рейтинг: 0 / 0
11.12.2012, 13:02
    #38073996
HOME_X
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск в TStream
HOME_X[
CopyStream(Main, fsList) - лишнее копирование хотелось бы избежать
Спасибо ....

Т.е. - хотелось бы сразу копировать во файловый стреам (а путь иметь возможность переопрделить)

Или переносить файл по факту закрытия стреам (не красивое решение)
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Поиск в TStream / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]