Просмотр файла (аналог lister TotalCommander) - C#
Формулировка задачи:
Подскажите пожалуйста,
1) возможно ли сделать чтобы из моего приложения все файлы открывались с помощью определенной программы (например AkelPad) не зависимо от расширения??? И как это реализовать на C#. Пытался реализовать через Process, но там используются ассоциации программ и расширений файлов. А нужно чтобы как в TotalCommander при нажатии на F3 или F4.
2) возможно ли использовать в собственном приложении Lister из TotalCommander??
3) можно ли в ListBox сделать чтобы было тоже как в TotalCommander, чтобы было видно не только имя файла но и его размер и дату создания, как 3 различных столбца??
4)столкнулся проблемой при считывании файла в 12 мб в RichTextBox, ошибка о том что в считываемом файле символов больше чем может отобразить компонент, подскажите как справиться с этим, может использовать другой компонент или какой нибудь другой способ. (в Lister TotalCommander свободно открывается и в Far тоже)
Решение задачи: «Просмотр файла (аналог lister TotalCommander)»
textual
Листинг программы
using System; using System.Drawing; using System.Windows.Forms; using System.IO; using System.Text; namespace WindowsFormsApplication75 { public partial class Form1 : Form { public Form1() { OpenFileDialog ofd = new OpenFileDialog(); if (ofd.ShowDialog(this) == System.Windows.Forms.DialogResult.OK) { FileStream stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read); FileViewer viewer = new FileViewer(stream); viewer.Parent = this; viewer.Dock = DockStyle.Fill; } } } //Просмотрщик больших файлов public class FileViewer : UserControl { Stream stream; int CharHeight; int CharWidth; public FileViewer(Stream stream) { this.stream = stream; // Font = new Font(FontFamily.GenericMonospace, 10); CharHeight = 15; CharWidth = 9; // AutoScroll = true; SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); } protected override void Dispose(bool disposing) { base.Dispose(disposing); stream.Dispose(); } protected override void OnResize(EventArgs e) { base.OnResize(e); if (ClientRectangle.Width > 0) { int symbolsPerPageLine = ClientRectangle.Width / CharWidth; int linesPerPage = ClientRectangle.Height / CharHeight; int linesCount = (int)stream.Length / symbolsPerPageLine; AutoScrollMinSize = new Size(1, 1 + linesCount + ClientRectangle.Height - linesPerPage); VerticalScroll.SmallChange = 1; VerticalScroll.LargeChange = ClientRectangle.Height / CharHeight; Invalidate(); } } protected override void OnScroll(ScrollEventArgs se) { base.OnScroll(se); Invalidate(); } protected override void OnPaint(PaintEventArgs e) { // int symbolsPerLine = ClientRectangle.Width / CharWidth; int linesPerPage = ClientRectangle.Height / CharHeight; int startPos = VerticalScroll.Value * symbolsPerLine; stream.Seek(startPos, SeekOrigin.Begin); // byte[] buffer = new byte[symbolsPerLine]; // for(int y=0; y < linesPerPage; y++) if (stream.Position < stream.Length) { int count = stream.Read(buffer, 0, buffer.Length); char[] chars = Encoding.Default.GetChars(buffer, 0, count); for (int x = 0; x < chars.Length; x++) e.Graphics.DrawString(chars[x].ToString(), Font, Brushes.Black, x * CharWidth, y * CharHeight); } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д