Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET

Автор: BaluBig
Дата сообщения: 18.04.2008 08:37
Yakon
А зачем ты читаешь файл порциями по килобайту что бы все равно накапливать результат в txt? Читай файл сразу весь и по событию, как советует helgi.
И вообще. Вот такие операции со строками в цикле
Код: txt = txt & System.Text.Encoding.ASCII.GetString(buffer)
Автор: Yakon
Дата сообщения: 18.04.2008 10:18
BaluBig
А можно дать кусок кода?
Я не программист и туго соображаю.
У меня кроме Dim FileStream As New FileStream("c:\logs.log", FileMode.Open, FileAccess.Read, FileShare.ReadWrite) всё остально отказалось читать файл, выбрасывая сообщение, что файл уже используется другим процессом.

Добавлено:
helgi
Сорри.
directory = Environment.GetFolderPath(Environment.SpecialFolder.Personal)
Dim watcher As New System.IO.FileSystemWatcher("C:\logs", "1.log")
Dim result As System.IO.WaitForChangedResult = watcher.WaitForChanged(System.IO.WatcherChangeTypes.Changed)
Main2()
Работает при изменении размера.
Но при
Dim FileStream As New FileStream("c:\logs\1.log", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
Dim buffer(1024) As Byte
Dim bytesRead As Integer
Dim txt As String = ""
While True
bytesRead = FileStream.Read(buffer, 0, buffer.Length)
If bytesRead = 0 Then
Exit While
End If
txt = txt & System.Text.Encoding.ASCII.GetString(buffer)
End While
FileStream.Close()
System.IO.File.AppendAllText("c:\logs\2.log", txt)
Получаю в txt:
18/03/2008 9:39:40 Started 3DSMediaPlayer
18/03/2008 9:39:40 Playing file C:\Program Files\Philips\3DSmedia\Hakim.s3d
18/03/2008 9:39:54 Playing file C:\Program Files\Philips\3DSmedia\Hakim.s3d
18/03/2008 9:40:08 Playing file C:\Program Files\Philips\3DSmedia\3D Solutions.s3d
18/03/2008 9:40:21 Stopping 3DSMediaPlayer (because of termination by user)
18/03/2008 9:40:37 Started 3DSMediaPlayer
18/03/2008 9:40:38 Playing file C:\Program Files\Philips\3DSmedia\3D Solutions.s3d
18/03/2008 9:40:52 Playing file C:\Program Files\Philips\3DSmedia\Hakim.s3d
18/03/2008 9:41:06 Stopping 3DSMediaPlayer (because of automated restart)
18/03/2008 9:41:06 Started 3DSMediaPlayer
18/03/2008 9:41:07 Playing file C:\Program Files\Philips\3DSmedia\3D Solutions.s3d
18/03/2008 9:41:08 Stopping 3DSMediaPlayer (because of termination by user)
18/03/2008 11:22:09 Started 3DSMediaPlayer
18/03/2008 11:22:09 Playing file C:\Program Files\Philips\3DSmedia\3D Solutions.s3d
18/03/2008 11:22:24 Playing file C:\Program Files\Philips\3DSmedia\Hakim.s3d
18/03/2008 11:22:38 Playing file C:\Program Files\Philips\3DSmedia\3D Solutions.s3d
18/03/2008 11:22:52 Playing file C:\Program Files\Philips\3DSmedia\Hakim.s3d
18/03/2008 11:23:06 Playing file C:\Program Files\Philips\3DSmedia\3D Solutions.s3d
ping 3DSMediaPlayer (because of termination by user)
18/03/2008 9:40:37 Started 3DSMediaPlayer
18/03/2008 9:40:38 Playing fi
ОТкуда берутся последние три строчки мне непонятно.
Как ещё можно прочитать файл открытый для записи?
Автор: BaluBig
Дата сообщения: 20.04.2008 11:19
Yakon

Цитата:
Я не программист и туго соображаю.
А может лучше пусть программисты этим занимаются (без обид)? Или аватарку смени
А пример кода - это можно.
Код:
Imports System.IO
Imports System.Text

Public Class MainForm
Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Основные настройки FileSystemWatcher
fsWatch.EnableRaisingEvents = True
fsWatch.NotifyFilter = System.IO.NotifyFilters.LastWrite
fsWatch.SynchronizingObject = Me
End Sub

Private Sub btAction_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAction.Click
If edFile.Enabled Then
edLog.Text = String.Empty

' Основные настройки FileSystemWatcher
fsWatch.Path = Path.GetDirectoryName(edFile.Text)
fsWatch.Filter = Path.GetFileName(edFile.Text)

' Запускаем слежение!
fsWatch.EnableRaisingEvents = True

edFile.Enabled = False
btAction.Text = "Stop"
Else
fsWatch.EnableRaisingEvents = False
edFile.Enabled = True
btAction.Text = "Start"
End If
End Sub

Private Sub fsWatch_Changed(ByVal sender As System.Object, ByVal e As System.IO.FileSystemEventArgs) Handles fsWatch.Changed
' Файловый поток
Dim fs As New FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
' Читатель текста из потока (что бы с буферами не возиться).
' Обрати внимание на указание кодировки!
Dim rdr As New StreamReader(fs, Encoding.GetEncoding(1251))
' Построитель строк (можно и без него)
Dim sb As New StringBuilder()

While Not rdr.EndOfStream()
' Вот так делаем если в цикле нужна конкатенация строк - это экономит
' память и время сборщика мусора. Оператор & - фу, лучше String.Append().
sb.AppendLine(rdr.ReadLine())
End While

' Получили результат в окошко.
edLog.Text = sb.ToString()

' А вот так можно и нужно было делать вместо StringBuilder и цикла While
'edLog.Text = rdr.ReadToEnd()

' Закрываем поток
rdr.Close()
End Sub
End Class
Автор: Yakon
Дата сообщения: 20.04.2008 17:45
BaluBig


Цитата:
А может лучше пусть программисты этим занимаются (без обид)? Или аватарку смени
А пример кода - это можно.

Ну а если нет программиста? А программа позарез нужна...
А чем моя аватара не нравится? Это всего лишь знак зодиака.
Спасибо за код, я в пятницу вечером похожий написал. Значит на правильном пути был...
Автор: MFPSoftware
Дата сообщения: 21.04.2008 22:56
Задумал писать тут программку, которая бы выводила html код в текстовое поле.

За текстовое поле взял textbox (мультилайн - тру).

Задача - добавлять поочередно строки, разделяя их символом перевода коретки.
Вот как добавлять туда я так и не понял. Можно только присвоить параметру text итоговое значение, которое выведется на экран, а как добавлять - не знаю.

Так вот, как добавить строку в конец контрола?

Или может я выбрал не тот компонент?
Автор: BaluBig
Дата сообщения: 22.04.2008 08:19
MFPSoftware
Я так понимаю, что нужно сначала собрать некий текст, потом его весь вывести в контрол. Если тупо и в лоб, никто не запрещает для каждой новой строки делать
Код: theTextBox.Text += "\r\n" + someString;
Автор: MFPSoftware
Дата сообщения: 22.04.2008 10:43
Вот блин... Такое элементарное решение, а сам чего-то не додумался. Все искал подобие метода Add... c# развращает =)

Спасибо
Автор: MFPSoftware
Дата сообщения: 22.04.2008 20:52
Подскажите еще такую вещь, как получить информацию из DataGridView?

Явное преобразование типа (int)DataGridView1.rows[1].cells[2].value не работает по причине, что не конвертируется тип Object в тип int.

И можно ли как-то настроить поля так, что бы они содержали определенный тип значений, вроде как это сделано в офисных БД, вроде Acсess'а?
Автор: BaluBig
Дата сообщения: 23.04.2008 13:12
MFPSoftware

Цитата:
Явное преобразование типа (int)DataGridView1.rows[1].cells[2].value не работает по причине, что не конвертируется тип Object в тип int.
Не работать это может только по одной причине: в ячейке не int. Даже если там, например, float, похожий на int, такое преобразование не будет работать потому, что происходит разбоксирование (unboxing) значения. Что бы не наступать на эти грабли можно воспользоваться классом Convert, а именно Convert.ToInt32(object). Предварительно проверив значение на равенство DBNull.Value.


Цитата:
И можно ли как-то настроить поля так, что бы они содержали определенный тип значений, вроде как это сделано в офисных БД, вроде Acсess'а?
В гриде - нет. Это можно сделать в DataTable, если грид с ним связан. И, кстати, можно к ячейкам обращаться так: DataGridView1[columnIndex, rowIndex].Value.

Автор: MFPSoftware
Дата сообщения: 23.04.2008 18:34

Цитата:
Не работать это может только по одной причине: в ячейке не int. Даже если там, например, float, похожий на int

В датагриде в значениях всегда базовый тип, даже в чекбоксах.
Вот именно этот базовый тип я и хотел преобразовать к целочисленному, методом (int), или как там эта штука называется.

Классом конверт получилось, спасибо.
Про индексацию таблицы тоже спасибо... так намного удобнее.
Автор: MFPSoftware
Дата сообщения: 23.04.2008 20:34
Снова вопросики... Подскажите, как взаимодействовать с новыми создаваемыми формами?

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

Вот как все это реализовать, я так и не понял.
Форма называется - Form2.
Я так понял, что нужно создать новый экземпляр этого класса, а затем его показать, так?

Form2 newForm = new Form2();
newForm.Show();

Форма то конечно запустилась, но вот как гонять данные туда-сюда я так и не понял.
Автор: BaluBig
Дата сообщения: 24.04.2008 08:31
MFPSoftware
Так. Похоже пора в магазин за книжкой. Я бы вот это рекомендовал (большой и толстый талмуд обо всём):
Нейгел, Ивьен, Глинн, Скиннер, Уотсон "C# 2005 и платформа .NET 3.0 для профессионалов".
В природе есть "C# 2008 ...", но на русский язык afaik не перевели еще. Есть в электронном виде (37Мб djvu).

Что касается передачи данных. В общем случае - создается у формы открытый метод, а лучше проперть, и с помощью этого передаются данные. Кроме Show есть еще ShowDialog для показа формы в модальном виде (форма должна выставлять сама себе значение проперти DialogResult). Если форма показана через Show и закрыта пользователем - для неё уже отработал метод Dispose и к повторному показу она уже не пригодна. В случае ShowDialog повторный показ возможен.

Добавлено:

Цитата:
В датагриде в значениях всегда базовый тип, даже в чекбоксах.
Да. Но это не мешает его приводить к тому, к чему надо. Но там есть нюанс.

Код:
float var1 = 3;
object var2 = var1;
int var3 = (int)var2; // Будет ошибка.
int var3 = (int)(float)var2; // А так будет работать.
Автор: KChernov
Дата сообщения: 24.04.2008 17:36
BaluBig

Цитата:
В природе есть "C# 2008 ...", но на русский язык afaik не перевели еще. Есть в электронном виде (37Мб djvu).

А можно ссылочку в приват (а то здесь вроде нельзя)?
Автор: DannyX
Дата сообщения: 28.04.2008 20:17

Цитата:
Снова вопросики... Подскажите, как взаимодействовать с новыми создаваемыми формами?

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

Вот как все это реализовать, я так и не понял.
Форма называется - Form2.
Я так понял, что нужно создать новый экземпляр этого класса, а затем его показать, так?

Form2 newForm = new Form2();
newForm.Show();

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

таки, кури get {} ; set {};
Автор: MFPSoftware
Дата сообщения: 30.04.2008 19:20
С этим вопрсом я уже разобрался. Спасибо.

Подскажите вот что:
сделал прмитивное подобие броузера, у которого в табах открываются компоненты WebBrowser. Все бы ничего, да вот только новые страницы он открывает в ИЕ.
Я перехватываю урл страницы в переменной "e" в событии Navigating, вот только никак не пойму, как определить, должна ли эта ссылка открываться в новой странице или же нет?
Автор: grin
Дата сообщения: 07.05.2008 13:09
Народ! Вопрос про MDI-приложения. А как отслеживать в родительском окне какое из дочерних окон закрылось, чтобы ресурсы этого окна освободить функцией Dispose() ? Насколько я знаю, при закрытии дочернего окна его ресурсы не освобождаются, а окно просто хидится.
Автор: BaluBig
Дата сообщения: 08.05.2008 21:59
grin
Неправда. Форма просто скрывается при закрытии если она была показана как модальная через ShowDialog(). Во всех остальных случаях при закрытии вызывается Dispose(). В этом легко убедиться проверив свойство Form.IsDisposed после закрытия формы.
Автор: grin
Дата сообщения: 12.05.2008 12:18
BaluBig
Да, ты прав. Тогда такой вопрос. Допускает ли сборщик мусора утечку памяти. Дело в том, что я в дочерних формах создаю объекты типа Bitmap и Graphics, работаю с ними, даже когда они мне не нужны вызываю принудительно Dispose() для них, но при закрытии дочерней формы ProcessExplorer показывает, что память не полностью освобождается, а при открытии новой формы вырастает больше чем при открытии первой формы (плюс остаток), хотя при открытии формы я принудительно запускаю GC.Collect()
Автор: BaluBig
Дата сообщения: 13.05.2008 11:40
grin

Цитата:
Допускает ли сборщик мусора утечку памяти.

Сборщик мусора не замечен в организации утечек памяти. С неуправляемыми ресурсами, в том числе с памятью, может быть не все так замечательно. Попробуй поиграться в таком духе (пример из MSDN):

Код:
class MyGCCollectClass
{
private const long maxGarbage = 1000;

static void Main()
{
MyGCCollectClass myGCCol = new MyGCCollectClass();

// Determine the maximum number of generations the system
     // garbage collector currently supports.
Console.WriteLine("The highest generation is {0}", GC.MaxGeneration);

myGCCol.MakeSomeGarbage();

// Determine which generation myGCCol object is stored in.
Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));

// Determine the best available approximation of the number
     // of bytes currently allocated in managed memory.
Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));

// Perform a collection of generation 0 only.
GC.Collect(0);
GC.WaitForPendingFinalizers(); // Тоже не лишнее - BaluBig

// Determine which generation myGCCol object is stored in.
Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));

Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));

// Perform a collection of all generations up to and including 2.
GC.Collect(2);
GC.WaitForPendingFinalizers(); // Тоже не лишнее - BaluBig

// Determine which generation myGCCol object is stored in.
Console.WriteLine("Generation: {0}", GC.GetGeneration(myGCCol));
Console.WriteLine("Total Memory: {0}", GC.GetTotalMemory(false));
Console.Read();
}

void MakeSomeGarbage()
{
Version vt;

for(int i = 0; i < maxGarbage; i++)
{
// Create objects and release them to fill up memory
     // with unused objects.
vt = new Version();
}
}
}
Автор: Lihonosov
Дата сообщения: 19.05.2008 14:51
Нужно написать многопользовательскую программу "Базу данных", которая работает с Oracle9. (на C#)
Хочу чтобы вначале спрашивался логин и пароль на программу и в зависимости от прав этого логина формировался доступ к соответствующим таблицам.
Если кто может уже писал такое или есть статья или пример?
Подскажите как реализовать/с чего начать!
На каком уровне лучше реализовать? (на уровне базы данных или на уровне приложения)?
Автор: V0lt
Дата сообщения: 20.05.2008 18:53
не могу разобраться как из второй формы изменять значения в первой

вот этот код нормально работает
Form1.cs

Код: public partial class Form1 : Form
{
Form2 form2 = new Form2();
.......
private void checkBox_viewform2_CheckedChanged(object sender, EventArgs e)
{
if (checkBox_viewform2.Checked)
form2.Show();
else
form2.Hide();

}

}
Автор: feor
Дата сообщения: 20.05.2008 20:52
V0lt
Этот код не работает потому, что скорее всего, ты не добавил form2 в коллекцию OwnedForms первой формы. Да и чекбокс должен быть приватным, у тебя нет доступа к нему из другой формы. Подпишись из form1 на событие Closing второй формы и в обработчике изменяй состояние чекбокса.
Автор: V0lt
Дата сообщения: 20.05.2008 22:22
feor
спасибо, вроде кое-чего получилось.

Код: namespace WindowsApplication1
{
public partial class Form1 : Form
{
Form2 form2 = new Form2();

public Form1()
{
InitializeComponent();
this.AddOwnedForm(form2);
}

остальное также
Автор: feor
Дата сообщения: 21.05.2008 00:27
V0lt
Вот, как-то так:


Код:
public partial class Form1 : Form
{
private Form2 form2 = new Form2();

public Form1()
{
InitializeComponent();

form2.FormClosing += new FormClosingEventHandler(form2_FormClosing);
}

private void form2_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
form2.Hide();
checkBox_viewform2.Checked = false;
}

private void checkBox_viewform2_CheckedChanged(object sender, EventArgs e)
{
if (checkBox_viewform2.Checked)
{
form2.Show();
}
else
{
form2.Hide();
}
}
}
Автор: xDeliC
Дата сообщения: 21.05.2008 16:49
здраствуйте...есть задачка на C# Си шарпе...надо написать плеер который бы просто проигрывал мп3 файлы...некаких наворотов ничего подскажите пожалуйсто где можно было бы посмотреть на примеры такого или же найти работаюшего + иходники... спс заранье
Автор: V0lt
Дата сообщения: 21.05.2008 17:28
feor

Цитата:
Вот, как-то так:

работает
спасибо
Автор: MFPSoftware
Дата сообщения: 26.05.2008 01:03
xDeliC
вот тут смотри видео - две части о том, как воспроизводить аудио двумя методами.

Добавлено:
http://msdn.microsoft.com/en-us/vcsharp/bb798022.aspx
Автор: penguen
Дата сообщения: 26.05.2008 13:30
Ребята, VB .Net работает ли с MySQL Server'om
Если работает, то как подкл. в Администр. =ODBC
Автор: Mike13x13
Дата сообщения: 26.05.2008 20:25
Lihonosov

Цитата:
Нужно написать многопользовательскую программу "Базу данных", которая работает с Oracle9. (на C#)
Хочу чтобы вначале спрашивался логин и пароль на программу и в зависимости от прав этого логина формировался доступ к соответствующим таблицам.
Если кто может уже писал такое или есть статья или пример?
Подскажите как реализовать/с чего начать!
На каком уровне лучше реализовать? (на уровне базы данных или на уровне приложения)?

Я делал раньше (да и сейчас работаю с таким проектом) реализацию прав юзеров на уровне приложения. Т.е., само приложение работает с базой от имени юзера, имеющего все необходимые права. В той же базе создаю табличку юзеров и реализую для них права, предусмотренные логикой приложения. После запуска сразу запрашивается логин/пароль, с базы затягивается инфа залогинившегося юзера (ну, или он посылается подальше, если таковой нету). И дальше контроль за всеми действиями юзера осуществляется самим приложением. Инормацию аккаунта, от имени которого работает приложение, сохраняю в шифрованном виде в файле конфигурации. Естественно, кто знает, что такое декомпиляция и т.п., может довольно легко (учитывая, что это .Нет) узнать алгоритм шифровки/дешифровки и получить инфо аккаута, от имени которого работает приложение. Но обычно на это не забиваются, такие приложения предназначенны практически всегда для юзеров, которым "взломы" такого рода не интересны, кроме того, чаще всего, они и не способны что-нить такое проделать.
Но если требуется повышенная секюрити, то не остается ничего другого, как заводить юзеров на сервере баз данных и регить приложение используя эти аккаунты, уже с предустановленными на сервере ограничениями (или сделать модуль шифровки-дешифровки отдельно (например на асемблере) с таким расчетом, чтоб хрен он декомпилировался нормально, или еще чего придумать). Так что смотри, думай, вибирай, что больше подходит.
Автор: Lihonosov
Дата сообщения: 27.05.2008 09:33
Mike13x13
Спасибо за ответ.
Буду делать так как Вы, для моей задачи такой реализации вполне хватит.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102

Предыдущая тема: Как удалить/добавить/отключить/включить устройство?


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.