1. Получите размер файла
Идея: используйте метод Open класса File, чтобы открыть указанный файл, а затем используйте свойство Length класса FileStream, чтобы получить длину файла.
(1) Метод Open класса File: используется для открытия FileStream по указанному пути, локальные права доступа на чтение/запись Формат синтаксиса: общедоступный статический FileStream Open (строковый путь, режим FileMode)
Описание параметра: путь: файл, который нужно открыть. mode : одно из значений перечисления FileMode
значение перечисления | инструкция |
---|---|
CreateNew | Указывает, что операционная система должна создавать новые файлы |
Create | Указывает, что операционная система должна создать новый файл, если файл уже существует, он будет перезаписан. |
Open | Указывает, что операционная система должна открыть существующий файл |
OpenOrCreate | Указывает, что операционная система должна открыть файл (если файл существует, в противном случае создать новый файл) |
Truncate | Указывает операционную систему для открытия существующего файла. После открытия файла его размер будет усечен до нуля байт. |
Append | Откройте существующий файл и перейдите в конец файла или создайте новый файл. |
(2), свойство Length класса FileStream
Свойство Length класса FileStream используется для получения длины потока в байтах.Синтаксис:
Public override long Length{get;}
Примечание. При использовании в программе классов, связанных с файлами, необходимо добавить пространство имен System.IO
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog openDialog = new OpenFileDialog();//Создаем объект диалога открытия файла
If (openDialog.ShowDialog()==DialogResult.OK)//Определяем, выбран ли файл
{
MessageBox.Show("Длина файла:"+File.Open(openDialog.FileName,FileMode.Open).Length+"byte");//Всплывает диалоговое окно сообщения
}
}
2. Получите суффикс имени файла:
OpenFileDialog openDialog = new OpenFileDialog();
if (openDialog.ShowDialog()==DialogResult.OK)
{
string a = openDialog.FileName.Substring(openDialog.FileName.LastIndexOf(".") + 1, openDialog.FileName.Length - openDialog.FileName.LastIndexOf(".") - 1);
MessageBox.Show(a);
}
3. Получить время создания файла:
OpenFileDialog openDialog = new OpenFileDialog();
if (openDialog.ShowDialog()==DialogResult.OK)
{
FileInfo f = new FileInfo(openDialog.FileName);
MessageBox.Show(f.CreationTime.ToString());
}
Примечание. Получить время последней модификации файла: FileInfo.LastWriteTime.ToString();
4. Получить запрещенные символы в именах файлов
Идея: в этом примере в основном используется метод GetInvalidFileNameChars() класса Path Синтаксис:
public static char[] GetInvalidFileNameChars();
Возвращаемое значение: массив, содержащий символы, недопустимые в именах файлов.
Примечание. Класс Path находится в пространстве имен System.IO.
пример:
char[] aa = Path.GetInvalidFileNameChars();
foreach (char a in aa)
{
listBox1.Items.Add(Convert.ToInt32(a).ToString());
}
5. Создание и удаление файлов
Метод Create класса File создает файл по указанному пути.Этот метод может перегружать метод.Синтаксис:
public static FileStream Create(string path);
Описание параметра:
Путь: путь и имя создаваемого файла.
Возвращаемое значение: FileStream, предоставляющий доступ для чтения и записи к файлу, указанному в пути.
Метод Delete класса File используется для удаления указанного файла, и если он не существует, исключение не выдается. грамматика:
public static void Delete(string path);
пример:
private void btn_Create_Click(object sender, EventArgs e)
{
SaveFileDialog P_SaveFileDialog = new SaveFileDialog();//Создаем объект диалога сохранения файла
If (P_SaveFileDialog.ShowDialog() == DialogResult.OK)//Определяем, сохранять ли файл
{
File.Create(P_SaveFileDialog.FileName);//Создаем файл
}
}
private void btn_Remove_Click(object sender, EventArgs e)
{
OpenFileDialog P_OpenFileDialog = new OpenFileDialog();//Создать объект диалога открытия файла
If (P_OpenFileDialog.ShowDialog() == DialogResult.OK)//Определяем, нужно ли удалять файл
{
File.Delete(P_OpenFileDialog.FileName);//Удалить файл
}
}
6. Очистите корзину
Идея: Очистка корзины в основном использует системную функцию API SHEmptyRecycleBin, синтаксис которой следующий:
[DllImportAttribute("shell32.dll")] //Объявление функций API
private static extern int SHEmptyRecycleBin(IntPtr handle, string root, int falgs);
Описание параметра: handle: дескриптор родительского окна.
Корень: адрес очищаемой корзины. Если он равен нулю, корзина на всех дисках будет очищена.
Falgs: параметры функции для очистки корзины.
Примечание. При использовании системных функций API сначала необходимо добавить пространство имен System.Runtime.InterServices в область пространства имен.
пример:
const int SHERB_NOCONFIRMATION = 0x000001; // Целочисленная константа в API указывает на отсутствие диалога подтверждения при удалении
const int SHERB_NOPROGRESSUI = 0x000002; //В API это означает, что индикатор выполнения удаления не отображается
const int SHERB_NOSOUND = 0x000004;
[DllImportAttribute("shell32.dll")] //Объявить функцию API
private static extern int SHEmptyRecycleBin(IntPtr handle, string root, int falgs);
private void button1_Click(object sender, EventArgs e)
{
//Очистить корзину
SHEmptyRecycleBin(this.Handle, "", SHERB_NOCONFIRMATION + SHERB_NOPROGRESSUI + SHERB_NOSOUND);
}
7. Изменить атрибуты файла
Идея: при изменении атрибутов файла используется атрибут Attributes класса FileInfo Формат синтаксиса следующий:
public FileAttributes Attributes { get; set; }
Описание параметра:
Одно из перечислений FileAttribute.
пример:
private void button2_Click(object sender, EventArgs e)
{
System.IO.FileInfo f = new System.IO.FileInfo(textBox1.Text);//Создаем экземпляр класса FileInfo
if (checkBox1.Checked == true) //если установлен флажок только для чтения
{
f.Attributes = System.IO.FileAttributes.ReadOnly;//Устанавливаем файл только для чтения
}
If (checkBox2.Checked == true) //Если установлен системный флажок
{
f.Attributes = System.IO.FileAttributes.System;//Установить файл в систему
}
if (checkBox3.Checked == true) //если отмечен флажок архива
{
f.Attributes = System.IO.FileAttributes.Archive;//Устанавливаем файл в архив
}
if (checkBox4.Checked == true) //если отмечен скрытый чекбокс
{
f.Attributes = System.IO.FileAttributes.Hidden;//Сделать файл скрытым
}
}
8. Преобразование длинных имен файлов в короткие имена файлов
GetShortPathName — это функция API ядра, которая преобразует длинные имена файлов в короткие. Синтаксис следующий:
[DllImport("Kernel32.dll")]//Объявить функции API
private static extern Int16 GetShortPathName(string lpszLongPath, StringBuilder lpszShortPath, Int16 cchBuffer);
Описание параметра:
lpszLongPath: Укажите имя файла, имя пути которого необходимо получить. Может быть полным путем или определяется текущим каталогом.
lpszShortPath: укажите буфер для короткого пути и имени загруженного файла.
cchBuffer: длина буфера lpszShortPath
пример:
[DllImport("Kernel32.dll")]//Объявить функции API
private static extern Int16 GetShortPathName(string lpszLongPath, StringBuilder lpszShortPath, Int16 cchBuffer);
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog OFDialog = new OpenFileDialog();//Создать объект OpenFileDialog
If (OFDialog.ShowDialog() == DialogResult.OK)//Определяем, выбран ли файл
{
TextBox1.Text = OFDialog.FileName;//Показать имя выбранного файла
String longName = textBox1.Text;//Записываем имя выбранного файла
StringBuilder shortName = new System.Text.StringBuilder(256);//Создать объект StringBuilder
GetShortPathName(longName, shortName, 256);//Вызов функции API для преобразования в короткое имя файла
String myInfo = "Длинное имя файла:" + longName;//Показать длинное имя файла
myInfo += "\nКороткое имя файла:" + shortName;//Показать короткое имя файла
label2.Text = myInfo;
}
}
9. Пример копирования одного файла
Пример 1. BackgroundWorker реализует асинхронное копирование файлов и отображает исходный код в процентах.
Используйте компонент BackgroundWorker, чтобы страница не отображалась в режиме ожидания.
интерфейс:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace WangHao
{
public partial class backgroundworder : Form
{
BackgroundWorker worker = null;
public backgroundworder()
{
InitializeComponent();
progressBar1.Minimum = 0;
progressBar1.Maximum = 100;
worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
try
{
if (e.Argument != null && e.Argument is FilePair)
{
FilePair obj = (FilePair)e.Argument;
string orgFile = obj.OrgFile;
string newFile = obj.NewFile;
FileStream readFileStream = new FileStream(orgFile, FileMode.Open, FileAccess.Read);
FileStream writeFileStream = new FileStream(newFile, FileMode.Create, FileAccess.Write);
DateTime start = DateTime.Now;
TimeSpan ts;
long totalByte = readFileStream.Length;
int buffLength = 1024 * 1024 * 64;
byte[] buff = new byte[buffLength];
long writtenByte = 0;
int everytimeReadByteLength = readFileStream.Read(buff, 0, buffLength);
while (everytimeReadByteLength > 0)
{
writeFileStream.Write(buff, 0, everytimeReadByteLength);
everytimeReadByteLength = readFileStream.Read(buff, 0, buffLength);
writtenByte += everytimeReadByteLength;
int percent = (int)(writtenByte * 100 / totalByte);
ts = DateTime.Now.Subtract(start);
double speed = (double)writtenByte / ts.TotalMilliseconds * 1000 / (1024 * 1024);
obj.Speed = speed;
worker.ReportProgress(percent, obj);//Передать пользовательский объект
}
writeFileStream.Close();
readFileStream.Close();
worker.ReportProgress(100);
}
}
catch (Exception ex)
{
worker.ReportProgress(100, ex);
}
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
FilePair obj = e.UserState as FilePair;
progressBar1.Value = e.ProgressPercentage;
label3.Text = e.ProgressPercentage + "%";
if (obj != null)
{
lblMsg.Text = "Копирование, скорость копирования" + obj.Speed.ToString() + "M";
}
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
lblMsg.Text = "Копирование файла завершено";
}
private void button1_Click(object sender, EventArgs e)
{
progressBar1.Value = 0;
string orgFile = textBox1.Text.Trim();
string newFile = textBox2.Text.Trim();
if (System.IO.File.Exists(orgFile))
{
bool copy = true;
if (System.IO.File.Exists(newFile))
{
If (DialogResult.Cancel == MessageBox.Show("Новый файл уже существует, не продолжайте копирование, новый файл будет перезаписан", "Файл уже существует", MessageBoxButtons.OKCancel))
{
copy = false;
}
}
if (copy)
{
FilePair fileObj = new FilePair(orgFile, newFile);
lblMsg.Text = "Начать копирование файла";
worker.RunWorkerAsync(fileObj);
}
}
else
{
lblMsg.Text = "Исходный файл не существует";
}
}
}
public class FilePair
{
private string _orgFile;
private string _newFile;
public FilePair(string orgfile, string newfile)
{
_orgFile = orgfile;
_newFile = newfile;
}
public string OrgFile
{
get { return _orgFile; }
set { _orgFile = value; }
}
public string NewFile
{
get { return _newFile; }
set { _newFile = value; }
}
public double Speed { get; set; }
}
}
Пример 2: Копирование одного файла в многопоточном режиме
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;//Пространство имен потоковой программы
using Microsoft.Win32.SafeHandles;
using System.Runtime.InteropServices;
namespace FileCopyPlan
{
открытый делегат void SpeedAndProgress(двойная скорость, двойной прогресс);//Определить делегата
public partial class Frm_Main : Form
{
public Frm_Main()
{
InitializeComponent();
}
private System.Threading.Thread thdAddFile;//Создаем поток
private string str = "";
private void button1_Click(object sender, EventArgs e)
{
If (openFileDialog1.ShowDialog() == DialogResult.OK)//Диалог открытия файла
TextBox1.Text = openFileDialog1.FileName;//Получить путь к исходному файлу
}
private void button2_Click(object sender, EventArgs e)
{
If (folderBrowserDialog1.ShowDialog() == DialogResult.OK)//Открыть диалоговое окно папки
TextBox2.Text = folderBrowserDialog1.SelectedPath;//Получить путь к целевому файлу
}
private void button3_Click(object sender, EventArgs e)
{
if (textBox1.Text.Length == 0 || textBox2.Text.Length == 0)
{
MessageBox.Show("Пожалуйста, выберите исходный путь к файлу или путь к целевому файлу.");
return;
}
str = textBox1.Text;//Записываем путь к исходному файлу
str = "\" + str.Substring(str.LastIndexOf('\') + 1, str.Length - str.LastIndexOf('\') - 1);//Получить имя исходного файла
thdAddFile = new Thread(new ThreadStart(RunAddFile));//Создать поток
thdAddFile.IsBackground = true;
thdAddFile.Start();//Выполнить текущий поток
}
/// <summary>
/// Скопируйте файл и закройте поток после завершения копирования
/// </summary>
public void RunAddFile()
{
FileOperation fo = new FileOperation();
fo.OnSpeedAndProgress += new SpeedAndProgress(Frm_Main_OnSpeedAndProgress);
fo.CopyFile(textBox1.Text, textBox2.Text + str, 1024 * 1024 * 64, progressBar1);//Копировать файл
MessageBox.Show("Копирование завершено", "Подсказка", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
thdAddFile.Abort();//Закрыть поток
}
/// <summary>
/// Копируем файл
/// </summary>
/// Путь к исходному файлу
/// Путь к файлу назначения
/// Размер передачи
/// Элемент управления ProgressBar
void Frm_Main_OnSpeedAndProgress(double speed, double progress)
{//Ключ к предотвращению зависания: вызывайте отображение формы при настройке хода выполнения и освобождайте поток пользовательского интерфейса, когда он не вызывается, чтобы убедиться, что основная форма не зависает.
This.BeginInvoke(new SpeedAndProgress(aa), new object[] { speed, progress });//Выполнить указанный делегат в потоке
}
void aa(double speed, double progress)
{
progressBar1.Value = Convert.ToInt32(progress);
label1.Text = speed.ToString();
label1.Refresh();
}
}
public class FileOperation
{
public event SpeedAndProgress OnSpeedAndProgress;
public const short FILE_ATTRIBUTE_NORMAL = 0x80;
public const short INVALID_HANDLE_VALUE = -1;
public const uint GENERIC_READ = 0x80000000;
public const uint GENERIC_WRITE = 0x40000000;
public const uint CREATE_NEW = 1;
public const uint CREATE_ALWAYS = 2;
public const uint OPEN_EXISTING = 3;
public const uint FILE_FLAG_NO_BUFFERING = 0x20000000;
public const uint FILE_FLAG_WRITE_THROUGH = 0x80000000;
public const uint FILE_SHARE_READ = 0x00000001;
public const uint FILE_SHARE_WRITE = 0x00000002;
// Use interop to call the CreateFile function.
// For more information about CreateFile,
// see the unmanaged MSDN reference library.
[DllImport("kernel32.dll", SetLastError = true)]
static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess,
uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,
uint dwFlagsAndAttributes, IntPtr hTemplateFile);
public void CopyFile(string FormerFile, string toFile, int SectSize, ProgressBar progressBar1)
{
bool useBuffer = true;
SafeFileHandle fr = CreateFile(FormerFile, GENERIC_READ, FILE_SHARE_READ, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
SafeFileHandle fw = CreateFile(toFile, GENERIC_WRITE, FILE_SHARE_READ, IntPtr.Zero, CREATE_ALWAYS, 0, IntPtr.Zero);
progressBar1.Value = 0;//Установить текущую позицию индикатора выполнения на 0
progressBar1.Minimum = 0;//Устанавливаем минимальное значение индикатора выполнения на 0
progressBar1.Maximum = 100;
int bufferSize = useBuffer ? 1024 * 1024 * 64 : 1024 * 1024 * 64;
FileStream fsr = new FileStream(fr, FileAccess.Read);
FileStream fsw = new FileStream(fw, FileAccess.Write);
BinaryReader br = new BinaryReader(fsr);
BinaryWriter bw = new BinaryWriter(fsw);
byte[] buffer = new byte[bufferSize];
Int64 len = fsr.Length;
DateTime start = DateTime.Now;
TimeSpan ts;
while (fsr.Position < fsr.Length)
{
int readCount = br.Read(buffer, 0, bufferSize);
bw.Write(buffer, 0, readCount);
ts = DateTime.Now.Subtract(start);
double speed = (double)fsr.Position / ts.TotalMilliseconds * 1000 / (1024 * 1024);
double progress = (double)fsr.Position / len * 100;
if (OnSpeedAndProgress != null)
{
OnSpeedAndProgress(speed, progress);
}
}
br.Close();
bw.Close();
}
}
}
10, INI-файл операции С#
Идеи: Для файловых INI-операций в основном используются системные API-функции GetPrivateProfileString и WritePrivateProfileString.
- GetPrivateProfileString Эта функция в основном используется для чтения содержимого файла INI. Синтаксис следующий: [DllImport("kernel32")]
private static extern int GetPrivateProfileString(string lpAppName,string lpKeyName,
string lpDefault,StringBuilder lpReturnedString,int nSize,string lpFileName);
Описание параметра:
параметр | инструкция |
---|---|
lpAppName | Представляет значение корневого узла внутри INI-файла. |
lpKeyName | Представляет значение дочернего тега в корневом узле. |
lpDefault | Указывает значение по умолчанию, когда значение тега не задано или не существует. |
lpReturnedString | Указывает, что возвращается значение прочитанного узла |
nSize | Указывает максимальную емкость содержимого узла для чтения |
lpFileName | Указывает полный путь к файлу |
- Функция WritePrivateProfileString используется для записи данных в файл INI.
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string mpAppName,string mpKeyName,
string mpDefault,string mpFileName);
Описание параметра:
параметр | инструкция |
---|---|
mpAppName | Представляет значение корневого узла внутри INI. |
mpKeyName | Указывает имя тега, который необходимо изменить. |
mpDefault | Указывает, что вы хотите изменить |
mpFileName | Указывает полный путь к файлу INI. |
пример:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
namespace INIFileOperate
{
public partial class Frm_Main : Form
{
public Frm_Main()
{
InitializeComponent();
}
#region область объявления переменной
public string str = "";//Эта переменная сохраняет конкретное физическое местоположение, где находится INI-файл
public string strOne = "";
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(
string lpAppName,
string lpKeyName,
string lpDefault,
StringBuilder lpReturnedString,
int nSize,
string lpFileName);
public string ContentReader(string area, string key, string def)
{
StringBuilder stringBuilder = new StringBuilder(1024); // Определяем переменную строку максимальной длины 1024
GetPrivateProfileString(area, key, def, stringBuilder, 1024, str); // Чтение INI-файла
Возвращаем stringBuilder.ToString();//Возвращаем содержимое INI-файла
}
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(
string mpAppName,
string mpKeyName,
string mpDefault,
string mpFileName);
#endregion
часть загрузки формы #region
private void Form1_Load(object sender, EventArgs e)
{
str = Application.StartupPath + "\\ConnectString.ini";//Физический адрес INI-файла
strOne = System.IO.Path.GetFileNameWithoutExtension(str);//Получить имя файла INI-файла
if (File.Exists(str)) if (File.Exists(str)) //Определяем, существует ли файл INI
{
Server.Text = ContentReader(strOne, "Data Source", "");//Чтение содержимого узла сервера в INI-файле
database.Text = ContentReader(strOne, "DataBase", "");//Чтение содержимого узла базы данных в INI-файле
uid.Text = ContentReader(strOne, "Uid", "");//Чтение содержимого пользовательского узла в INI-файле
pwd.Text = ContentReader(strOne, "Pwd", "");//Чтение содержимого узла пароля в INI-файле
}
}
#endregion
#регион для модификации
private void button1_Click(object sender, EventArgs e)
{
if (File.Exists(str)) if (File.Exists(str)) //Определяем, существует ли INI-файл
{
//Изменить содержимое узла сервера в INI-файле
WritePrivateProfileString(strOne, "DataBase", database.Text, str); //Изменяем содержимое узла базы данных в INI-файле
//Изменяем содержимое пользовательского узла в INI-файле
WritePrivateProfileString(strOne, "Pwd", pwd.Text, str);//Изменяем содержимое узла пароля в INI-файле
MessageBox.Show("Поздравляем, модификация прошла успешно!", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Информация);
}
else
{
MessageBox.Show("К сожалению, файл, который вы хотите изменить, не существует, пожалуйста, подтвердите и измените его!", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
#endregion
}
}
11. Создавайте PDF-файлы
Идея: Для создания PDF-документов используется сторонний компонент itextsharp.dll.
пример:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
namespace CreatePDFDocument
{
public partial class Frm_Main : Form
{
public Frm_Main()
{
InitializeComponent();
}
//Эта переменная содержит имя документа PDF
public static string filePath = "";
//Создаем PDF-документ
private void button1_Click(object sender, EventArgs e)
{
SaveFileDialog saveFileDialog = new SaveFileDialog(); // Предоставляем информацию о сохранении файла и определяем место сохранения
saveFileDialog.Filter = "Файл PDF (*.PDF)|*.PDF";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
filePath = saveFileDialog.FileName;
//Начнем создавать PDF-документ, сначала объявив объект Document
Document document = new Document();
//Инициализировать объект файлового потока с указанным путем и режимом создания
PdfWriter.getInstance(document, new FileStream(filePath, FileMode.Create));
Document.Open();//Открываем документ
BaseFont baseFont = BaseFont.createFont(@"c:\windows\fonts\SIMSUN.TTC,1", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
iTextSharp.text.Font font = new iTextSharp.text.Font(baseFont, 20);//Установить стиль шрифта документа
Document.Add(new Paragraph(richTextBox1.Text, font));//Добавить содержимое в документ PDF
Document.Close();//Закрываем документ
MessageBox.Show("Поздравляем, документ успешно создан!", "Информация", MessageBoxButtons.OK, MessageBoxIcon.Информация);
}
}
}
}
12. Определяем, занят ли файл
пример:
using System.IO;
using System.Runtime.InteropServices;
[DllImport("kernel32.dll")]
public static extern IntPtr _lopen(string lpPathName, int iReadWrite);
[DllImport("kernel32.dll")]
public static extern bool CloseHandle(IntPtr hObject);
public const int OF_READWRITE = 2;
public const int OF_SHARE_DENY_NONE = 0x40;
public readonly IntPtr HFILE_ERROR = new IntPtr(-1);
private void button1_Click(object sender, EventArgs e)
{
string vFileName = @"c:\temp\temp.bmp";
if (!File.Exists(vFileName))
{
MessageBox.Show("Файл не существует!");
return;
}
IntPtr vHandle = _lopen(vFileName, OF_READWRITE | OF_SHARE_DENY_NONE);
if (vHandle == HFILE_ERROR)
{
MessageBox.Show("Файл занят!");
return;
}
CloseHandle(vHandle);
MessageBox.Show("Не занято!");
}
13. Реализовать операцию перетаскивания файлов
Идея: Для реализации операции перетаскивания файлов в основном используется свойство Data класса DragEventArgs и метод GetDataPresent класса DataObject.
- Свойство данных класса DragEventArgs
Класс DragEventArgs содержит параметры, относящиеся ко всем событиям перетаскивания (DragEnter, DragLeave, DragOver и Drop), а его свойство Data используется для чтения объекта данных, содержащего данные, связанные с соответствующим событием перетаскивания. Синтаксис свойства Data следующий:
public IDataObject Data { get; }
Описание параметра: значение свойства, объект данных, объект содержит данные, связанные с соответствующим событием перетаскивания.
- Метод GetDataPresent класса DataObject
Класс DataObject в основном реализует механизм передачи данных, а его метод GetDataPresent используется для определения того, связаны ли данные, хранящиеся в объекте DataObject, с указанным форматом.
bool GetDataPresent(string format);
Описание параметра: format: Проверяемый формат. Возвращаемое значение: True, если данные, хранящиеся в объекте DataObject, связаны с указанным форматом или могут быть преобразованы в указанный формат; в противном случае — false.
- Метод GetData класса DataObject
Метод GetData класса DataObject используется для возврата данных, связанных с указанным форматом данных.Синтаксис следующий:
object GetData(string format);
формат: формат данных для проверки.
Возвращаемое значение: данные, связанные с указанным форматом, или не нуль.
пример:
public partial class Frm_Main : Form
{
public Frm_Main()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.AllowDrop = true;
}
private void Form1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
String[] files = (string[])e.Data.GetData(DataFormats.FileDrop);//Получить основную информацию о перетаскиваемом файле
for (int i = 0; i
{
ListBox1.Items.Add(files[i]);//Путь для добавления файлов
}
}
}
}
14. Разделите файлы на несколько небольших файлов и объедините
Идея: Операция разделения файлов в основном реализуется через классы FileStream, BinaryReader и BinaryWriter. Инициализируйте файловый поток FileStream со строкой, соответствующей полному пути к файлу и режиму открытия файла, затем инициализируйте средство чтения файлов BinaryReader с файловым потоком FileStream и, наконец, разделите большой файл на несколько небольших файлов с помощью цикла инструкции for.
- BinaryReader, который в основном использует определенную кодировку для чтения примитивных типов данных как двоичных значений, а его конструктор в основном использует UTF8Encoding для инициализации экземпляров класса BinaryReader. Синтаксис следующий:
public BinaryReader(Stream input);
При разделении файла используется метод ReadBytes класса BinaryReader, который используется для чтения байтов count из текущего потока в массив байтов и продвижения текущей позиции на байты count. Синтаксис следующий:
public virtual byte[] ReadBytes(int count);
- Класс BinaryWriter записывает тип Jiyuan в поток в двоичной форме и поддерживает запись строк в определенной кодировке. Его конструктор в основном использует UTF-8 в качестве кодировки строки для инициализации экземпляра класса BinaryWriter. Синтаксис следующий: public BinaryWriter (потоковый вывод);
Метод Write класса BinaryWriter используется для записи содержимого в разделяемый файл Этот метод используется для записи значения в текущий Синтаксис следующий: public virtual void Write(byte[] buffer);
пример:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace FileComminuteUnite
{
public partial class Frm_Main : Form
{
public Frm_Main()
{
InitializeComponent();
}
#region разделенный файл
/// <summary>
/// разделить файл
/// </summary>
/// Разделить блок
/// размер разделения
/// Путь хранения сегментированного файла
/// Файл для разделения
/// Отображение индикатора выполнения
public void SplitFile(string strFlag, int intFlag, string strPath, string strFile, ProgressBar PBar)
{
int iFileSize = 0;
//Установить размер разделенных небольших файлов в соответствии с выбором
switch (strFlag)
{
case "Byte":
iFileSize = intFlag;
break;
case "KB":
iFileSize = intFlag * 1024;
break;
case "MB":
iFileSize = intFlag * 1024 * 1024;
break;
case "GB":
iFileSize = intFlag * 1024 * 1024 * 1024;
break;
}
FileStream SplitFileStream = new FileStream(strFile, FileMode.Open);//Инициализировать экземпляр файлового потока FileStream строкой, соответствующей полному пути к файлу и режиму открытия файла
BinaryReader SplitFileReader = new BinaryReader(SplitFileStream);//Инициализировать программу чтения файлов BinaryReader с файловым потоком FileStream
Byte[] TempBytes;//Максимальное количество данных, прочитанных за разбивку
int iFileCount = (int)(SplitFileStream.Length / iFileSize);//Общее количество маленьких файлов
PBar.Maximum = iFileCount;
if (SplitFileStream.Length % iFileSize != 0) iFileCount++;
string[] TempExtra = strFile.Split('.');
//Цикл разбивает большой файл на несколько маленьких файлов
for (int i = 1; i <= iFileCount; i++)
{
//Определяем имя файла маленького файла
String sTempFileName = strPath + @"\" + i.ToString().PadLeft(4, '0') + "." + TempExtra[TempExtra.Length - 1];//Маленькое имя файла
FileStream TempStream = new FileStream(sTempFileName, FileMode.OpenOrCreate);//Инициализировать экземпляр файлового потока FileStream в соответствии с именем файла и режимом открытия файла
BinaryWriter TempWriter = new BinaryWriter(TempStream); //Создание и инициализация экземпляра модуля записи BinaryWriter с экземпляром FileStream
TempBytes = SplitFileReader.ReadBytes(iFileSize);//Чтение данных указанного размера из большого файла
TempWriter.Write(TempBytes);//Записываем эти данные в небольшой файл
TempWriter.Close();//Закрываем модуль записи, чтобы сформировать небольшой файл
TempStream.Close();//Закрываем файловый поток
PBar.Value = i - 1;
}
SplitFileReader.Close();//Закрываем программу чтения больших файлов
SplitFileStream.Close();
MessageBox.Show("Успешная сегментация файла!");
}
#endregion
private void frmSplit_Load(object sender, EventArgs e)
{
timer1.Start();//Запускаем таймер
}
//Выбираем файл для разделения
private void btnSFile_Click(object sender, EventArgs e)
{
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
txtFile.Text = openFileDialog.FileName;
}
}
//Выполнить операцию разделения файла
private void btnSplit_Click(object sender, EventArgs e)
{
try
{
if (txtLength.Text == ""||txtFile.Text.Trim()==""||txtPath.Text.Trim()=="")
{
MessageBox.Show("Пожалуйста, заполните информацию полностью!", "Подсказка", MessageBoxButtons.OK, MessageBoxIcon.Information);
txtLength.Focus();
}
else if (cboxUnit.Text == "")
{
MessageBox.Show("Пожалуйста, выберите файл для разделения!", "Подсказка", MessageBoxButtons.OK, MessageBoxIcon.Information);
cboxUnit.Focus();
}
else
{
SplitFile(cboxUnit.Text, Convert.ToInt32(txtLength.Text.Trim()), txtPath.Text, txtFile.Text, progressBar);
}
}
catch { }
}
//Выбираем путь хранения разделенного файла
private void btnSPath_Click(object sender, EventArgs e)
{
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
txtPath.Text = folderBrowserDialog.SelectedPath;
}
}
//Контролируем доступный статус кнопок "Разделить"/"Объединить"
private void timer1_Tick(object sender, EventArgs e)
{
if (txtFile.Text != "" && txtPath.Text != "")
btnSplit.Enabled = true;
else
btnSplit.Enabled = false;
}
}
}
объединить файлы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace FileComminuteUnite
{
public partial class Frm_Main : Form
{
public Frm_Main()
{
InitializeComponent();
}
#region объединить файлы
/// <summary>
/// Объединяем файлы
/// </summary>
/// коллекция файлов для слияния
/// Имя объединенного файла
/// Отображение индикатора выполнения
public void CombinFile(string[] strFile, string strPath, ProgressBar PBar)
{
PBar.Maximum = strFile.Length;
FileStream AddStream = null;
//Создаем и инициализируем файловый поток FileStream с объединенным именем файла и методом открытия
AddStream = new FileStream(strPath, FileMode.Append);
//Инициализируем модуль записи BinaryWriter с файловым потоком FileStream, который используется для объединения разделенных файлов
BinaryWriter AddWriter = new BinaryWriter(AddStream);
FileStream TempStream = null;
BinaryReader TempReader = null;
// Объединяем небольшие файлы в цикле и генерируем объединенный файл
for (int i = 0; i < strFile.Length; i++)
{
//Инициализируем файловый поток FileStream с именем файла и режимом открытия, соответствующим маленькому файлу, который играет роль чтения и разделения
TempStream = new FileStream(strFile[i].ToString(), FileMode.Open);
TempReader = new BinaryReader(TempStream);
//Чтение данных в разделенном файле и создание объединенного файла
AddWriter.Write(TempReader.ReadBytes((int)TempStream.Length));
//Закрываем программу чтения файлов BinaryReader
TempReader.Close();
//Закрываем файловый поток FileStream
TempStream.Close();
PBar.Value = i + 1;
}
//Закрываем средство записи файлов BinaryWriter
AddWriter.Close();
//Закрываем файловый поток FileStream
AddStream.Close();
MessageBox.Show("Файл успешно объединен!");
}
#endregion
private void frmSplit_Load(object sender, EventArgs e)
{
timer1.Start();//Запускаем таймер
}
//Выбираем файл для синтеза
private void btnCFile_Click(object sender, EventArgs e)
{
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
string Selectfile = "";
string[] files = openFileDialog.FileNames;
for (int i = 0; i < files.Length; i++)
{
Selectfile += "," + files[i].ToString();
}
if (Selectfile.StartsWith(","))
{
Selectfile = Selectfile.Substring(1);
}
if (Selectfile.EndsWith(","))
{
Selectfile.Remove(Selectfile.LastIndexOf(","),1);
}
txtCFile.Text = Selectfile;
}
}
//Выбираем путь хранения синтезированного файла
private void btnCPath_Click(object sender, EventArgs e)
{
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
txtCPath.Text = saveFileDialog.FileName;
}
}
//Выполнение операции с составным файлом
private void btnCombin_Click(object sender, EventArgs e)
{
try
{
if (txtCFile.Text.Trim() == "" || txtCPath.Text.Trim() == "")
{
MessageBox.Show("Пожалуйста, введите полную информацию!", "Подсказка", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
if (txtCFile.Text.IndexOf(",") == -1)
MessageBox.Show("Выберите не менее двух файлов для синтеза!", "Подсказка", MessageBoxButtons.OK, MessageBoxIcon.Information);
else
{
string[] strFiles = txtCFile.Text.Split(',');
CombinFile(strFiles, txtCPath.Text, progressBar);
}
}
}
catch { }
}
//Контролируем доступный статус кнопки "Объединить"
private void timer1_Tick(object sender, EventArgs e)
{
if (txtCFile.Text != "" && txtCPath.Text != "")
btnCombin.Enabled = true;
else
btnCombin.Enabled = false;
}
}
}