实验五 文件与流
WPF还不太会...抄STZG的,其他自己写的。
一、实验目的
- 掌握文件类的使用;
- 掌握文件流的操作;
- 掌握二进制数据、文本数据的读写;
- 继续应用WPF技术进行界面编程。
二、实验内容
- 要求用户输入一个目录名。
如果输入的是有效目录,列出该目录下所有文件和目录:对于目录,名字用[]括起来;对于文件,在文件名后用三个数字加一个字母表示其文件大小,如123B, 123K, 123M等。
提示:可使用右移操作符>>。
using System; using System.IO; namespace ConsoleApp1 { class Program { static void Main(string[] args) { string path = Console.ReadLine();///输入的根目录 if (!Directory.Exists(path)) { Console.WriteLine("当前路径不存在"); return; } dfs(path,0); } static void dfs(string path,int spaces)///当前所在路径 { for(int i = 0; i < spaces; i++) { Console.Write(" "); } Console.WriteLine("["+path+"]:");///输出当前目录 DirectoryInfo root = new DirectoryInfo(path);///当前路径下的所有文件 FileInfo[] files = root.GetFiles(); foreach(var i in files) { for (int j = 0; j < spaces+4; j++) Console.Write(" "); Console.Write("该目录下文件:"+i); Console.WriteLine(" " + CountSize(i.ToString()) ); ///输出文件大小 } DirectoryInfo[] dics = root.GetDirectories(); for(int i = 0; i < dics.Length; i++) { dfs(dics[i].ToString(), spaces + 10); } return; } static string CountSize(string sFullName) { long lSize = 0; if (File.Exists(sFullName)) lSize = new FileInfo(sFullName).Length; string m_strSize = ""; long FactSize = lSize; if (FactSize < 1024.00) m_strSize = String.Format("{0:N3}", FactSize) + "B"; else if (FactSize >= 1024.00 && FactSize < 1048576) m_strSize = String.Format("{0:N3}", FactSize >> 10) + "K"; else if (FactSize >= 1048576 && FactSize < 1073741824) m_strSize = String.Format("{0:N3}", FactSize >> 20) + "M"; else if (FactSize >= 1073741824) m_strSize = String.Format("{0:N3}", FactSize >> 30) + "G"; return m_strSize; } } } |
Update(2021.6.29):奇怪的是之前这么做可以读出来的,现在在dfs里面每次要加上之前路径的前缀...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string path = "E:\\HB";
//string path = Console.ReadLine();///输入的根目录
if (!Directory.Exists(path))
{
Console.WriteLine("当前路径不存在");
return;
}
Console.WriteLine(path);
dfs(path, 0);
Console.ReadKey();
}
static void dfs(string path, int spaces)///当前所在路径
{
for (int i = 0; i < spaces; i++)
{
Console.Write(" ");
}
Console.WriteLine("[" + path + "]:");///输出当前目录
DirectoryInfo root = new DirectoryInfo(path);///当前路径下的所有文件
FileInfo[] files = root.GetFiles();
foreach (var i in files)
{
for (int j = 0; j < spaces + 4; j++) Console.Write(" ");
Console.Write("该目录下文件:" + i);
Console.WriteLine(" " + CountSize( (path+"\\"+i).ToString()));/*之前做实验是没写"//"就可以了...现在怎么不加异常了*/
///输出文件大小
}
DirectoryInfo[] dics = root.GetDirectories();
for (int i = 0; i < dics.Length; i++)
{
dfs((path+"\\"+dics[i]).ToString(), spaces + 10);/*之前做实验是没写"//"就可以了...现在怎么不加异常了*/
}
return;
}
static string CountSize(string sFullName)
{
long lSize = 0;
if (File.Exists(sFullName))
lSize = new FileInfo(sFullName).Length;
string m_strSize = "";
long FactSize = lSize;
if (FactSize < 1024.00)
m_strSize = String.Format("{0:N3}", FactSize) + "B";
else if (FactSize >= 1024.00 && FactSize < 1048576)
m_strSize = String.Format("{0:N3}", FactSize >> 10) + "K";
else if (FactSize >= 1048576 && FactSize < 1073741824)
m_strSize = String.Format("{0:N3}", FactSize >> 20) + "M";
else if (FactSize >= 1073741824)
m_strSize = String.Format("{0:N3}", FactSize >> 30) + "G";
return m_strSize;
}
}
}
- 在Code目录下存放着一些文件。遍历该目录,统计其中各个接口的出现次数,分别打印各文件中使用量居前5的接口及次数。现假定接口名称都如IList、ICacheManager
1)接口名称的最主要特征:以I字符开头,第二字符大写。要求:不包含<,如IList<string>应只计IList;以“//”开头的注释不参与统计。
2)按照目录à文件à行à单词à字符的层次关系,逐步深入。
目录:目录名、Directory或DirectoryInfo
文件:文件名、File或FileInfo
行:StreamReader.ReadLine()
单词:String的Split()方法
字符:String[0]
3)接口及对应次数可用Dictionary<string, int>保存,其中的string类型的“键”保存接口名称,int类型的“值”保存该接口的次数。
可使用ContainsKey、TryGetValue、Add或索引符来添加、访问和修改键值对。注意:如果用索引符访问不存在的键会抛出异常,所以在访问之前应试探该值是否存在。
4)字典中的值可用Values属性访问,它可转换为List,然后可排序,访问其中的最大值。
using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.IO; namespace ConsoleApp2 { class Program { static Dictionary<string, int> map1 = new Dictionary<string, int>(); class P:IComparable<P> { public string Name { get; set; } public int val { get; set; } public int CompareTo(P other) { return other.val.CompareTo(this.val); } } public static void Main(string[] args) { string path = "E:\\C#代码\\第五次实验\\Code"; GetDirectory(path); } static void GetDirectory(string path) { DirectoryInfo root = new DirectoryInfo(path);///当前路径下的所有文件 Console.WriteLine("当前目录" + root); GetFile(root); } static void GetFile(DirectoryInfo root) { FileInfo[] files = root.GetFiles(); foreach (var i in files) { Console.Write(" "); Console.WriteLine("该目录下文件:" + i); Getline(i.ToString()); } } static void Getline(string Filename) { StreamReader sr = new StreamReader(Filename); string line; map1.Clear(); while ( (line=sr.ReadLine())!=null ){///读文件的每一行 GetWord(line); } List<P> list = new List<P>(); foreach (var j in map1) { P now = new P(); now.Name = j.Key; now.val = j.Value; list.Add(now); } list.Sort(); Console.WriteLine("用到最多的"+Math.Min(5,list.Count)+"个接口"); for (int j = 0; j < Math.Min(5, list.Count); j++) { Console.WriteLine(list[j].Name + " " + list[j].val); } } static void GetWord(string line) { String[] str = line.Split();///每一行分割成单词 foreach(var i in str) { GetByte(i); } } static void GetByte(string str)///利用map进行统计 { if (str.Length < 2) return; if (str[0] == '/' && str[0] == '/') return; if (str[0] != 'I') return; if (!(str[1] >= 'A' && str[1] <= 'Z')) return; int pre = str.Length; int suf = 0; for(int i = 0; i < str.Length; i++) { if (pre == str.Length&&str[i]=='<') { pre = i; } if (suf == 0 && str[i] == '>') { suf = i; } } string temp = ""; for (int i = 0; i < pre; i++) { temp += str[i]; } Console.WriteLine(temp); if (!map1.ContainsKey(temp)) { map1.Add(temp, 1); } else { map1[temp]++; } } } } |
- 写一个记事本程序:
(1)设计界面,向窗体添加下拉式菜单、文本框、打开文件对话框、保存文件对话框。
(2)依次为“文件”下的“新建”、“打开”、“保存”菜单项的Click事件添加事件处理函数。
(3)实现文本文件的打开、编辑和保存功能;
提示:
(1) 窗口可用DockPanel进行布局,让菜单和工具栏都位于顶部,即:
DockPanel.Dock="Top"。
(2) 文本文件的显示与编辑可以使用TextBox控件。
(3) 使用命令绑定,让菜单项和工具栏同时与一个操作相关联。
在MainWindow.xaml的Window标签下加:
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.New" Executed="NewCommand_Executed"/>
<CommandBinding Command="ApplicationCommands.Open" Executed="OpenCommand_Executed"/>
<CommandBinding Command="ApplicationCommands.Save" Executed="SaveCommand_Executed"/>
</Window.CommandBindings>
在菜单项添加:
<MenuItem Header="新建(_N)" Command="New"/>
在工具栏添加:
<Button Content="新建" Command="New"/>
就可绑定命令。同时Ctrl+O等键盘组合也默认与Open命令相绑定。
(4) 添加bool类型_saved字段,标记当前内容是否已保存。
(5) 打开文件时,弹出打开文件对话框,操作代码如下:
OpenFileDialog dlg = new OpenFileDialog();
dlg.DefaultExt = "*.txt";
dlg.Filter = "Text Files (*.txt)|*.txt";
bool? result = dlg.ShowDialog();
if (result == true)
{
string fileName = dlg.FileName;
自此可对该文件名进行操作。
(6) 保存文件时,实际可实现“另存为”功能。弹出保存文件对话框,操作代码如下:
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "文本文件|*.txt|所有文件|*.*";
saveFileDialog.FilterIndex = 0;
bool? result = saveFileDialog.ShowDialog();
if (result == true)
{
string strFile = saveFileDialog.FileName;
自此可对该文件名进行操作。
<Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp1" mc:Ignorable="d" Title="记事本" Height="450" Width="800"> <Window.CommandBindings> <CommandBinding Command="ApplicationCommands.New" Executed="NewCommand_Executed"/> <CommandBinding Command="ApplicationCommands.Open" Executed="OpenCommand_Executed"/> <CommandBinding Command="ApplicationCommands.Save" Executed="SaveCommand_Executed"/> <CommandBinding Command="ApplicationCommands.Print" Executed="PrintCommand_Executed"/> </Window.CommandBindings> <DockPanel> <DockPanel.Resources> <Style TargetType="{x:Type Button}" x:Key="formatTextStyle"> <Setter Property="FontFamily" Value="Palatino Linotype"></Setter> <Setter Property="Width" Value="30"></Setter> <Setter Property="FontSize" Value ="14"></Setter> <Setter Property="CommandTarget" Value="{Binding ElementName=MainTextBox}"></Setter> </Style> <Style TargetType="{x:Type Button}" x:Key="formatImageStyle"> <Setter Property="Width" Value="30"></Setter> <Setter Property="CommandTarget" Value="{Binding ElementName=MainTextBox}"></Setter> </Style> </DockPanel.Resources> <Menu x:Name="MainMenu" DockPanel.Dock="Top"> <MenuItem Header="文件"> <MenuItem Header="新建(_N)" Command="New"/> <MenuItem Header="打开(_O)" Command="Open"/> <MenuItem Header="保存(_S)" Command="Save"/> <MenuItem Header="打印(_P)" Command="Print"/> </MenuItem> <MenuItem Header="格式"> <MenuItem Header="自动换行(_W)"/> <MenuItem Header="字体(_F)"/> </MenuItem> </Menu> <RichTextBox x:Name="MainTextBox" DockPanel.Dock="Top" Height="300" TextChanged="MainTextBox_TextChanged" AcceptsTab="True"> <FlowDocument> <Paragraph> <Run></Run> </Paragraph> </FlowDocument> </RichTextBox> <StatusBar DockPanel.Dock="Bottom"> <TextBlock x:Name="MainStatusBar"></TextBlock> </StatusBar> </DockPanel> </Window> |
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Microsoft.Win32; namespace WpfApp1 { public partial class MainWindow : Window { private bool _saved; private string title { set { Title = value; } get { return Title; } } public MainWindow() { InitializeComponent(); } private void NewCommand_Executed(object sender, ExecutedRoutedEventArgs e) { _saved = false; TextRange range; range = new TextRange(MainTextBox.Document.ContentStart, MainTextBox.Document.ContentEnd); range.Text = ""; } private void OpenCommand_Executed(object sender, ExecutedRoutedEventArgs e) { OpenFileDialog dlg = new OpenFileDialog(); dlg.DefaultExt = "*.txt"; dlg.Filter = "Text Files (*.txt)|*.txt"; bool? result = dlg.ShowDialog(); string str = null; if (result == true) { string _fileName = dlg.FileName; TextRange range; FileStream fStream; if (File.Exists(_fileName)) { title = _fileName; range = new TextRange(MainTextBox.Document.ContentStart, MainTextBox.Document.ContentEnd); fStream = new FileStream(_fileName, FileMode.OpenOrCreate); range.Load(fStream, DataFormats.XamlPackage); fStream.Close(); } } } private void SaveCommand_Executed(object sender, ExecutedRoutedEventArgs e) { if (_saved) { return; } SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "文本文件|*.txt|所有文件|*.*"; saveFileDialog.FilterIndex = 0; bool? result = saveFileDialog.ShowDialog(); if (result == true) { string strFile = saveFileDialog.FileName; TextRange range; FileStream fStream; range = new TextRange(MainTextBox.Document.ContentStart, MainTextBox.Document.ContentEnd); fStream = new FileStream(strFile, FileMode.Create); range.Save(fStream, DataFormats.XamlPackage); fStream.Close(); _saved = true; MainStatusBar.Text = "保存到" + strFile; } } private void PrintCommand_Executed(object sender, ExecutedRoutedEventArgs e) { PrintDialog pd = new PrintDialog(); if ((pd.ShowDialog() == true)) { //use either one of the below pd.PrintVisual(MainTextBox as Visual, "printing as visual"); pd.PrintDocument((((IDocumentPaginatorSource)MainTextBox.Document).DocumentPaginator), "printing as paginator"); } } private void MainTextBox_TextChanged(object sender, TextChangedEventArgs e) { _saved = false; } private void LineCommand_Executed(object sender, ExecutedRoutedEventArgs e) { } private void FontSelectCommand_Executed(object sender, ExecutedRoutedEventArgs e) { } } } |
- 附加:如果还没有选定期末大作业,可使用下面这一题目:(本次实验可不上交,会在超星上新建一个大作业上交,有时间的同学可尝试这个练习)
运用WPF技术,模仿Windows 10系统中计算机器(Calculator)程序,开发一个类似程序。
至少完成:
1)可执行四则运算;
2)数值和运算符按钮采用不同的样式;
加分项:
1)计算机器功能的完整性,如暂存功能、算式列表等;
2)是否使用了数据绑定、模板、样式、依赖项属性等特性;
3)注释和文档;
4)其它功能上的创新。
三、实验心得与体会
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)