c#文件操作大全(二)


/// <param name="fsModifiers">组合键</param>
/// <param name="vk">热键</param>
private void RegKey(IntPtr hwnd, int hotKey_id, int fsModifiers, int vk)
{
bool result;
if (RegisterHotKey(hwnd,hotKey_id,fsModifiers,vk) == 0)
{
result = false;
}
else
{
result = true;
}
if (!result)
{
MessageBox.Show("注册热键失败!");
}
}

/// <summary>
/// 注销热键
/// </summary>
/// <param name="hwnd">窗口句柄</param>
/// <param name="hotKey_id">热键ID</param>
private void UnRegKey(IntPtr hwnd, int hotKey_id)
{
UnregisterHotKey(hwnd,hotKey_id);
}
三、重写WndProc方法,实现注册 protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch(m.Msg)
{
case WM_HOTKEY: //窗口消息-热键
switch(m.WParam.ToInt32())
{
case 32: //热键ID
MessageBox.Show("Hot Key : Ctrl + Alt + Shift + Space");
break;
   default:
   break;
}
break;
case WM_CREATE: //窗口消息-创建
RegKey(Handle,Space,MOD_ALT | MOD_CONTROL | MOD_SHIFT,VK_SPACE); //注册热键
break;
case WM_DESTROY: //窗口消息-销毁
UnRegKey(Handle,Space); //销毁热键
break;
default:
break;
}
}
附:虚拟键值表
{ Virtual Keys, Standard Set }
{$EXTERNALSYM VK_LBUTTON}
VK_LBUTTON = 1;
{$EXTERNALSYM VK_RBUTTON}
VK_RBUTTON = 2;
{$EXTERNALSYM VK_CANCEL}
VK_CANCEL = 3;
{$EXTERNALSYM VK_MBUTTON}
VK_MBUTTON = 4; { NOT contiguous with L & RBUTTON }
{$EXTERNALSYM VK_BACK}
VK_BACK = 8;
{$EXTERNALSYM VK_TAB}
VK_TAB = 9;
{$EXTERNALSYM VK_CLEAR}
VK_CLEAR = 12;
{$EXTERNALSYM VK_RETURN}
VK_RETURN = 13;
{$EXTERNALSYM VK_SHIFT}
VK_SHIFT = $10;
{$EXTERNALSYM VK_CONTROL}
VK_CONTROL = 17;
{$EXTERNALSYM VK_MENU}
VK_MENU = 18;
{$EXTERNALSYM VK_PAUSE}
VK_PAUSE = 19;
{$EXTERNALSYM VK_CAPITAL}
VK_CAPITAL = 20;
{$EXTERNALSYM VK_KANA }
VK_KANA = 21;
{$EXTERNALSYM VK_HANGUL }
VK_HANGUL = 21;
{$EXTERNALSYM VK_JUNJA }
VK_JUNJA = 23;
{$EXTERNALSYM VK_FINAL }
VK_FINAL = 24;
{$EXTERNALSYM VK_HANJA }
VK_HANJA = 25;
{$EXTERNALSYM VK_KANJI }
VK_KANJI = 25;
{$EXTERNALSYM VK_CONVERT }
VK_CONVERT = 28;
{$EXTERNALSYM VK_NONCONVERT }
VK_NONCONVERT = 29;
{$EXTERNALSYM VK_ACCEPT }
VK_ACCEPT = 30;
{$EXTERNALSYM VK_MODECHANGE }
VK_MODECHANGE = 31;
{$EXTERNALSYM VK_ESCAPE}
VK_ESCAPE = 27;
{$EXTERNALSYM VK_SPACE}
VK_SPACE = $20;
{$EXTERNALSYM VK_PRIOR}
VK_PRIOR = 33;
{$EXTERNALSYM VK_NEXT}
VK_NEXT = 34;
{$EXTERNALSYM VK_END}
VK_END = 35;
{$EXTERNALSYM VK_HOME}
VK_HOME = 36;
{$EXTERNALSYM VK_LEFT}
VK_LEFT = 37;
{$EXTERNALSYM VK_UP}
VK_UP = 38;
{$EXTERNALSYM VK_RIGHT}
VK_RIGHT = 39;
{$EXTERNALSYM VK_DOWN}
VK_DOWN = 40;
{$EXTERNALSYM VK_SELECT}
VK_SELECT = 41;
{$EXTERNALSYM VK_PRINT}
VK_PRINT = 42;
{$EXTERNALSYM VK_EXECUTE}
VK_EXECUTE = 43;
{$EXTERNALSYM VK_SNAPSHOT}
VK_SNAPSHOT = 44;
{$EXTERNALSYM VK_INSERT}
VK_INSERT = 45;
{$EXTERNALSYM VK_DELETE}
VK_DELETE = 46;
{$EXTERNALSYM VK_HELP}
VK_HELP = 47;
{ VK_0 thru VK_9 are the same as ASCII '0' thru '9' ($30 - $39) }
{ VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' ($41 - $5A) }
{$EXTERNALSYM VK_LWIN}
VK_LWIN = 91;
{$EXTERNALSYM VK_RWIN}
VK_RWIN = 92;
{$EXTERNALSYM VK_APPS}
VK_APPS = 93;
{$EXTERNALSYM VK_NUMPAD0}
VK_NUMPAD0 = 96;
{$EXTERNALSYM VK_NUMPAD1}
VK_NUMPAD1 = 97;
{$EXTERNALSYM VK_NUMPAD2}
VK_NUMPAD2 = 98;
{$EXTERNALSYM VK_NUMPAD3}
VK_NUMPAD3 = 99;
{$EXTERNALSYM VK_NUMPAD4}
VK_NUMPAD4 = 100;
{$EXTERNALSYM VK_NUMPAD5}
VK_NUMPAD5 = 101;
{$EXTERNALSYM VK_NUMPAD6}
VK_NUMPAD6 = 102;
{$EXTERNALSYM VK_NUMPAD7}
VK_NUMPAD7 = 103;
{$EXTERNALSYM VK_NUMPAD8}
VK_NUMPAD8 = 104;
{$EXTERNALSYM VK_NUMPAD9}
VK_NUMPAD9 = 105;
{$EXTERNALSYM VK_MULTIPLY}
VK_MULTIPLY = 106;
{$EXTERNALSYM VK_ADD}
VK_ADD = 107;
{$EXTERNALSYM VK_SEPARATOR}
VK_SEPARATOR = 108;
{$EXTERNALSYM VK_SUBTRACT}
VK_SUBTRACT = 109;
{$EXTERNALSYM VK_DECIMAL}
VK_DECIMAL = 110;
{$EXTERNALSYM VK_DIVIDE}
VK_DIVIDE = 111;
{$EXTERNALSYM VK_F1}
VK_F1 = 112;
{$EXTERNALSYM VK_F2}
VK_F2 = 113;
{$EXTERNALSYM VK_F3}
VK_F3 = 114;
{$EXTERNALSYM VK_F4}
VK_F4 = 115;
{$EXTERNALSYM VK_F5}
VK_F5 = 116;
{$EXTERNALSYM VK_F6}
VK_F6 = 117;
{$EXTERNALSYM VK_F7}
VK_F7 = 118;
{$EXTERNALSYM VK_F8}
VK_F8 = 119;
{$EXTERNALSYM VK_F9}
VK_F9 = 120;
{$EXTERNALSYM VK_F10}
VK_F10 = 121;
{$EXTERNALSYM VK_F11}
VK_F11 = 122;
{$EXTERNALSYM VK_F12}
VK_F12 = 123;
{$EXTERNALSYM VK_F13}
VK_F13 = 124;
{$EXTERNALSYM VK_F14}
VK_F14 = 125;
{$EXTERNALSYM VK_F15}
VK_F15 = 126;
{$EXTERNALSYM VK_F16}
VK_F16 = 127;
{$EXTERNALSYM VK_F17}
VK_F17 = 128;
{$EXTERNALSYM VK_F18}
VK_F18 = 129;
{$EXTERNALSYM VK_F19}
VK_F19 = 130;
{$EXTERNALSYM VK_F20}
VK_F20 = 131;
{$EXTERNALSYM VK_F21}
VK_F21 = 132;
{$EXTERNALSYM VK_F22}
VK_F22 = 133;
{$EXTERNALSYM VK_F23}
VK_F23 = 134;
{$EXTERNALSYM VK_F24}
VK_F24 = 135;
{$EXTERNALSYM VK_NUMLOCK}
VK_NUMLOCK = 144;
{$EXTERNALSYM VK_SCROLL}
VK_SCROLL = 145;
{ VK_L & VK_R - left and right Alt, Ctrl and Shift virtual keys.
Used only as parameters to GetAsyncKeyState() and GetKeyState().
No other API or message will distinguish left and right keys in this way. }
{$EXTERNALSYM VK_LSHIFT}
VK_LSHIFT = 160;

84.菜单勾选/取消完成后关闭计算机

int flg=EWX_FORCE | EWX_POWEROFF;
            bool ok;
            TokPriv1Luid tp;
            IntPtr hproc = GetCurrentProcess();
            IntPtr htok = IntPtr.Zero;
            k = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref   htok);
            tp.Count = 1;
            tp.Luid = 0;
            tp.Attr = SE_PRIVILEGE_ENABLED;
            k = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref   tp.Luid);
            k = AdjustTokenPrivileges(htok, false, ref   tp, 0, IntPtr.Zero, IntPtr.Zero);
            k = ExitWindowsEx(flg, 0);

85.菜单勾选/取消完成后重新启动计算机

int flg=EWX_FORCE | EWX_REBOOT;
            bool ok;
            TokPriv1Luid tp;
            IntPtr hproc = GetCurrentProcess();
            IntPtr htok = IntPtr.Zero;
            k = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref   htok);
            tp.Count = 1;
            tp.Luid = 0;
            tp.Attr = SE_PRIVILEGE_ENABLED;
            k = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref   tp.Luid);
            k = AdjustTokenPrivileges(htok, false, ref   tp, 0, IntPtr.Zero, IntPtr.Zero);
            k = ExitWindowsEx(flg, 0);

86.菜单勾选/取消完成后注销计算机

int flg=EWX_FORCE | EWX_LOGOFF;
            bool ok;
            TokPriv1Luid tp;
            IntPtr hproc = GetCurrentProcess();
            IntPtr htok = IntPtr.Zero;
            k = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref   htok);
            tp.Count = 1;
            tp.Luid = 0;
            tp.Attr = SE_PRIVILEGE_ENABLED;
            k = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref   tp.Luid);
            k = AdjustTokenPrivileges(htok, false, ref   tp, 0, IntPtr.Zero, IntPtr.Zero);
            k = ExitWindowsEx(flg, 0);

87.菜单勾选/取消开机自启动程序
public void RunWhenStart(bool Started)
        {
string name=%%1;
string path=Application.ExecutablePath;
            RegistryKey HKLM = Registry.LocalMachine;
            RegistryKey Run = HKLM.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
            if (Started == true)
            {
               try
                {
                    Run.SetValue(name, path);
                    HKLM.Close();
                }
                catch (Exception)
                {
                    MessageBox.Show("注册表修改错误(开机自启未实现)");
              }
            }
            else
            {
                try
                {
                    if (Run.GetValue(name) != null)
                   {
                        Run.DeleteValue(name);
                      HKLM.Close();
                   }
                    else
                        return;
                }
               catch (Exception e)
               {
                   //ExceptionTransact.WriteErrLog(base.GetType().Name, e.Message);
MessageBox(e.Message);
               }
           }
        }

88.菜单勾选/取消自动登录系统

89.模拟键盘输入字符串
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 KenZhang.Free.VirtualInput;
using System.Runtime.InteropServices;

namespace VirtualInputDemo
{
    public partial class Form1 : Form
    {
        public const int INPUT_KEYBOARD = 1;
        public const int KEYEVENTF_KEYUP = 0x0002;
        [DllImport("user32.dll")]
        public static extern UInt32 SendInput(UInt32 nInputs, ref INPUT pInputs, int cbSize);
        [StructLayout(LayoutKind.Explicit)]
        public struct INPUT
        {
            [FieldOffset(0)]
            public Int32 type;
            [FieldOffset(4)]
            public KEYBDINPUT ki;
            [FieldOffset(4)]
            public MOUSEINPUT mi;
            [FieldOffset(4)]
            public HARDWAREINPUT hi;
        }


        [StructLayout(LayoutKind.Sequential)]
        public struct MOUSEINPUT
        {
            public Int32 dx;
            public Int32 dy;
            public Int32 mouseData;
            public Int32 dwFlags;
            public Int32 time;
            public IntPtr dwExtraInfo;
        }
        [StructLayout(LayoutKind.Sequential)]
        public struct KEYBDINPUT
        {
            public Int16 wVk;
            public Int16 wScan;
            public Int32 dwFlags;
            public Int32 time;
            public IntPtr dwExtraInfo;
        }
        [StructLayout(LayoutKind.Sequential)]
        public struct HARDWAREINPUT
        {
            public Int32 uMsg;
            public Int16 wParamL;
            public Int16 wParamH;
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Focus();
            INPUT inDown = new INPUT();
            inDown.type = INPUT_KEYBOARD;
            inDown.ki.wVk = (int)Keys.A;
            //INPUT inUp = new INPUT();
            //inUp.type = INPUT_KEYBOARD;
            //inUp.ki.wVk = (int)Keys.A;
            //inUp.ki.dwFlags = KEYEVENTF_KEYUP;
            SendInput(1, ref  inDown, Marshal.SizeOf(inDown));
            //SendInput(1, ref  inUp, Marshal.SizeOf(inUp));
        }
    }
}

90.提取PDF文件中的文本
xpdf
   public partial class Form1 : Form
    {
        public OpenFileDialog fdlg = new OpenFileDialog();//打开文件对话框
        public string filename;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ofdlg.Filter = "pdf文件(*.pdf)|*.pdf";//选择pdf文件
            if (ofdlg.ShowDialog() == DialogResult.OK)
            {
                filename = string.Format("{0}", ofdlg.FileName);
            }         
        }
      //传送打开文件对话框中得到的filename来做为外部程序的参数来做转化
        private void button2_Click(object sender, EventArgs e)
        {
            Process p = new Process();
            string path = "pdftotext.exe"; //进程启用外部程序
                            //这个exe我放在debug文件夹下面     
            p.StartInfo.FileName = path;
            p.StartInfo.Arguments = string.Format( filename + " -");//很怪异的一行
                                  //参数“-”表示可以得到输出流
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
         
            p.Start();
            string s = p.StandardOutput.ReadToEnd();//得到pdf文档中的文本内容
            textBox1.Text = s;
            p.Close();
        }
    }
}


上面的程序运行后,如果是在Debug文件夹下的pdf文件就可以得到输出,可是如果在打开文件对话框中打开我桌面上的一个pdf如:@"d:\我的文档\test.pdf",输出就会是空,但是如果把上面那怪异的一行改为:
C# code
p.StartInfo.Arguments = string.Format( @"d:\我的文档\test.pdf" + " -");


程序就又会得到输出。
呵呵,谢谢楼上的兄台,下载的xpdf中xpdftotext.exe用到的配置文件xpdfrc需要手动配置,我如果把那些字体啊,什么的映射成绝对路径下的文件,就不会出现上面的问题,但是我把配置文件中的路径改成了相对路径,于是就出现了上面的问题了,看兄台能够很轻易的就运行成功,一定是做过很多代码的,这里还得劳烦兄台再给看一下,帮下忙,能遇到一个大神不容易,大神可不能吝啬啊,先谢过了哈

91.操作内存映射文件

    IntPtr vFileHandle = CreateFile(@"c:\temp\temp.txt",
        GENERIC_READ | GENERIC_WRITE, FileShare.Read | FileShare.Write,
        IntPtr.Zero,  FileMode.Open,
        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, IntPtr.Zero);
    if (INVALID_HANDLE_VALUE != (int)vFileHandle)
    {
        IntPtr vMappingHandle = CreateFileMapping(
            vFileHandle, IntPtr.Zero, PAGE_READWRITE, 0, 0, "~MappingTemp");
        if (vMappingHandle != IntPtr.Zero)
        {
            IntPtr vHead = MapViewOfFile(vMappingHandle,
                FILE_MAP_COPY | FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, IntPtr.Zero);
            if (vHead != IntPtr.Zero)
            {
                uint vSize = GetFileSize(vFileHandle, IntPtr.Zero);
                for (int i = 0; i <= vSize / 2; i++)
                {
                    byte vTemp = Marshal.ReadByte((IntPtr)((int)vHead + i));
                    Marshal.WriteByte((IntPtr)((int)vHead + i),
                        Marshal.ReadByte((IntPtr)((int)vHead + vSize - i - 1)));
                    Marshal.WriteByte((IntPtr)((int)vHead + vSize - i - 1), vTemp);
                }
                UnmapViewOfFile(vHead);
            }
            CloseHandle(vMappingHandle);
        }
        CloseHandle(vFileHandle);
    }

92.重定向windows控制台程序的输出信息
      delegate void dReadLine(string strLine);
        private void excuteCommand(string strFile, string args, dReadLine onReadLine)
        {
             System.Diagnostics.Process p = new System.Diagnostics.Process();
             p.StartInfo = new System.Diagnostics.ProcessStartInfo();
             p.StartInfo.FileName = strFile;
             p.StartInfo.Arguments = args;
             p.StartInfo.WindowStyle. = System.Diagnostics.ProcessWindowStyle.Hidden;
             p.StartInfo.RedirectStandardOutput = true;
             p.StartInfo.UseShellExecute = false;
             p.StartInfo.CreateNoWindow = true;
             p.Start();
             System.IO.StreamReader reader = p.StandardOutput;//截取输出流
            string line = reader.ReadLine();//每次读取一行
            while (!reader.EndOfStream)
            {
                 onReadLine(line);
                 line = reader.ReadLine();
             }
             p.WaitForExit();
         }
        private void PrintMessage(string strLine)
        {
            this.textBox1.Text += strLine + " ";
         }
             excuteCommand("ipconfig", "", new dReadLine(PrintMessage));

93.接受邮件

94.发送邮件
using System;
using System.Net.Sockets;
using System.Net;
using System.Security.Cryptography;
using System.IO;
// 类名:Pop3
// 功能:接收电子邮件

namespace ZTSX.Email
{
/// <summary>
/// Pop3 的摘要说明。
/// </summary>
public class Pop3
{
private string mstrHost     = null; //主机名称或IP地址
private int mintPort     = 110; //主机的端口号(默认为110)
private TcpClient mtcpClient   = null; //客户端
private NetworkStream mnetStream = null; //网络基础数据流
private StreamReader m_stmReader = null; //读取字节流
private string mstrStatMessage   = null; //执行STAT命令后得到的消息(从中得到邮件数)

/// <summary>
/// 构造函数
/// </summary>
/// <remarks>一个邮件接收对象</remarks>
public Pop3()
{
}

/// <summary>
/// 构造函数
/// </summary>
/// <param name="host">主机名称或IP地址</param>
public Pop3(string host)
{
   mstrHost = host;
}

/// <summary>
/// 构造函数
/// </summary>
/// <param name="host">主机名称或IP地址</param>
/// <param name="port">主机的端口号</param>
/// <remarks>一个邮件接收对象</remarks>
public Pop3(string host,int port)
{
   mstrHost = host;
   mintPort = port;
}

#region 属性

/// <summary>
/// 主机名称或IP地址
/// </summary>
/// <remarks>主机名称或IP地址</remarks>
public string HostName
{
   get{return mstrHost;}
   set{mstrHost = value;}
}

/// <summary>
/// 主机的端口号
/// </summary>
/// <remarks>主机的端口号</remarks>
public int Port
{
   get{return mintPort;}
   set{mintPort = value;}
}

#endregion

#region 私有方法

/// <summary>
/// 向网络访问的基础数据流中写数据(发送命令码)
/// </summary>
/// <param name="netStream">可以用于网络访问的基础数据流</param>
/// <param name="command">命令行</param>
/// <remarks>向网络访问的基础数据流中写数据(发送命令码)</remarks>
private void WriteToNetStream(ref NetworkStream netStream,String command)
{
   string strToSend = command + "\r\n";
   byte[] arrayToSend = System.Text.Encoding.ASCII.GetBytes(strToSend.ToCharArray());
      netStream.Write(arrayToSend,0,arrayToSend.Length);
}

/// <summary>
/// 检查命令行结果是否正确
/// </summary>
/// <param name="message">命令行的执行结果</param>
/// <param name="check">正确标志</param>
/// <returns>
/// 类型:布尔
/// 内容:true表示没有错误,false为有错误
/// </returns>
/// <remarks>检查命令行结果是否有错误</remarks>
private bool CheckCorrect(string message,string check)
{
   if(message.IndexOf(check) == -1)
    return false;
   else
    return true;
}

/// <summary>
/// 邮箱中的未读邮件数
/// </summary>
/// <param name="message">执行完LIST命令后的结果</param>
/// <returns>
/// 类型:整型
/// 内容:邮箱中的未读邮件数
/// </returns>
/// <remarks>邮箱中的未读邮件数</remarks>
private int GetMailNumber(string message)
{
   string[] strMessage = message.Split(' ');
   return Int32.Parse(strMessage[1]);
}

/// <summary>
/// 得到经过解码后的邮件的内容
/// </summary>
/// <param name="encodingContent">解码前的邮件的内容</param>
/// <returns>
/// 类型:字符串
/// 内容:解码后的邮件的内容
/// </returns>
/// <remarks>得到解码后的邮件的内容</remarks>
private string GetDecodeMailContent(string encodingContent)
{
   string strContent = encodingContent.Trim();
   string strEncode = null;

   int iStart = strContent.IndexOf("Base64");
   if(iStart == -1)
    throw new Pop3Exception("邮件内容不是Base64编码,请检查");
   else
   {
    strEncode = strContent.Substring(iStart + 6,strContent.Length - iStart - 6);
    try
    {
     return SX.Encode.TransformToString(strEncode);
    }
    catch(SX.EncodeException exc)
    {
     throw new Pop3Exception(exc.Message);
    }
   }
}

#endregion

/// <summary>
/// 与主机建立连接
/// </summary>
/// <returns>
/// 类型:布尔
/// 内容:连接结果(true为连接成功,false为连接失败)
/// </returns>
/// <remarks>与主机建立连接</remarks>
public bool Connect()
{
   if(mstrHost == null)
    throw new Exception("请提供SMTP主机名称或IP地址!");
   if(mintPort == 0)
    throw new Exception("请提供SMTP主机的端口号");
   try
   {
    mtcpClient = new TcpClient(mstrHost,mintPort);
    mnetStream = mtcpClient.GetStream();
    m_stmReader = new StreamReader(mtcpClient.GetStream());

    string strMessage = m_stmReader.ReadLine();
    if(CheckCorrect(strMessage,"+OK") == true)
     return true;
    else
     return false;
   }
   catch(SocketException exc)
   {
    throw new Pop3Exception(exc.ToString());
   }
   catch(NullReferenceException exc)
   {
    throw new Pop3Exception(exc.ToString());
   }
}

#region Pop3命令

/// <summary>
/// 执行Pop3命令,并检查执行的结果
/// </summary>
/// <param name="command">Pop3命令行</param>
/// <returns>
/// 类型:字符串
/// 内容:Pop3命令的执行结果
/// </returns>
private string ExecuteCommand(string command)
{
   string strMessage = null; //执行Pop3命令后返回的消息

   try
   {
    //发送命令
    WriteToNetStream(ref mnetStream,command);

    //读取多行
    if(command.Substring(0,4).Equals("LIST") || command.Substring(0,4).Equals("RETR") || command.Substring(0,4).Equals("UIDL")) //记录STAT后的消息(其中包含邮件数)
    {
     strMessage = ReadMultiLine();

     if(command.Equals("LIST")) //记录LIST后的消息(其中包含邮件数)
      mstrStatMessage = strMessage;
    }
     //读取单行
    else
     strMessage = m_stmReader.ReadLine();

    //判断执行结果是否正确
    if(CheckCorrect(strMessage,"+OK"))
     return strMessage;
    else
     return "Error";
   }
   catch(IOException exc)
   {
    throw new Pop3Exception(exc.ToString());
   }
}

/// <summary>
/// 在Pop3命令中,LIST、RETR和UIDL命令的结果要返回多行,以点号(.)结尾,
/// 所以如果想得到正确的结果,必须读取多行
/// </summary>
/// <returns>
/// 类型:字符串
/// 内容:执行Pop3命令后的结果
/// </returns>
private string ReadMultiLine()
{
   string strMessage = m_stmReader.ReadLine();
   string strTemp = null;
   while(strMessage != ".")
   {
    strTemp = strTemp + strMessage;
    strMessage = m_stmReader.ReadLine();
   }
   return strTemp;
}

//USER命令
private string USER(string user)
{
   return ExecuteCommand("USER " + user) + "\r\n";
}

//PASS命令
private string PASS(string password)
{
   return ExecuteCommand("PASS " + password) + "\r\n";
}

//LIST命令
private string LIST()
{
   return ExecuteCommand("LIST") + "\r\n";
}

//UIDL命令
private string UIDL()
{
   return ExecuteCommand("UIDL") + "\r\n";
}

//NOOP命令
private string NOOP()
{
   return ExecuteCommand("NOOP") + "\r\n";
}

//STAT命令
private string STAT()
{
   return ExecuteCommand("STAT") + "\r\n";
}

//RETR命令
private string RETR(int number)
{
   return ExecuteCommand("RETR " + number.ToString()) + "\r\n";
}

//DELE命令
private string DELE(int number)
{
   return ExecuteCommand("DELE " + number.ToString()) + "\r\n";
}

//QUIT命令
private void Quit()
{
   WriteToNetStream(ref mnetStream,"QUIT");
}

/// <summary>
/// 收取邮件
/// </summary>
/// <param name="user">用户名</param>
/// <param name="password">口令</param>
/// <returns>
/// 类型:字符串数组
/// 内容:解码前的邮件内容
/// </returns>
private string[] ReceiveMail(string user,string password)
{
   int iMailNumber = 0; //邮件数

   if(USER(user).Equals("Error"))
    throw new Pop3Exception("用户名不正确!");
   if(PASS(password).Equals("Error"))
    throw new Pop3Exception("用户口令不正确!");
   if(STAT().Equals("Error"))
    throw new Pop3Exception("准备接收邮件时发生错误!");
   if(LIST().Equals("Error"))
    throw new Pop3Exception("得到邮件列表时发生错误!");

   try
   {
    iMailNumber = GetMailNumber(mstrStatMessage);

    //没有新邮件
    if(iMailNumber == 0)
     return null;
    else
    {
     string[] strMailContent = new string[iMailNumber];

     for(int i = 1 ; i <= iMailNumber ; i++)
     {
      //读取邮件内容
      strMailContent[i - 1] = GetDecodeMailContent(RETR(i));
     }
     return strMailContent;
    }
   }
   catch(Pop3Exception exc)
   {
    throw new Pop3Exception(exc.ToString());
   }
}

#endregion


/// <summary>
/// 收取邮件  
/// </summary>
/// <param name="user">用户名</param>
/// <param name="password">口令</param>
/// <returns>
/// 类型:字符串数组
/// 内容:解码前的邮件内容
/// </returns>
///<remarks>收取邮箱中的未读邮件</remarks>
public string[] Receive(string user,string password)
{
   try
   {
    return ReceiveMail(user,password);
   }
   catch(Pop3Exception exc)
   {
    throw new Pop3Exception(exc.ToString());
   }
}

/// <summary>
/// 断开所有与服务器的会话
/// </summary>
/// <remarks>断开所有与服务器的会话</remarks>
public void DisConnect()
{
   try
   {
    Quit();
    if(m_stmReader != null)
     m_stmReader.Close();
    if(mnetStream != null)
     mnetStream.Close();
    if(mtcpClient != null)
     mtcpClient.Close();
   }
   catch(SocketException exc)
   {
    throw new Pop3Exception(exc.ToString());
   }
}

/// <summary>
/// 删除邮件
/// </summary>
/// <param name="number">邮件号</param>
public void DeleteMail(int number)
{
   //删除邮件
   int iMailNumber = number + 1;
   if(DELE(iMailNumber).Equals("Error"))
    throw new Pop3Exception("删除第" + iMailNumber.ToString() + "时出现错误!");
}

}
}

95.报表相关

2、水晶报表的两种格式
   1)pull模式,不利用DataSet,直接从数据库中取出数据
   2) push模式,使用DataSet,利用它进行数据的加载和处理等
3. 水晶报表使用的库
   1)水晶报表的引擎(CREnging.dll),作用:合并数据,装换格式
   2)水晶报表设计器(CRDesigner.dll),作用:设计标题,插入数据等
   3)水晶报表查看控件(CRWebFormViewer.DLL)
   4)需要引入的命名空间
     using CrystalDecisions.CrystalReports.Engine;
     using CrystalDecisions.Shared;
4、Pull模式下使用水晶报表
   1)创建rpt文件
   2)拖放CrystalReportViewer
   3)绑定
5、读取水晶报表文件
   private void ReadCRV(cryatalReportViewer crv)
   {
     openFileDialog dlg=new OpenFileDialog();
     dlg.Title="打开水晶报表文件";
     dlg.Filter="水晶报表文件(*.rpt)|*.rpt|所有文件|*.*";
     if(dlg.showDialog()==DialogResult.OK)
     {
       crv.ReportSource=dlg.FileName;
     }
   }
6. B/S下读取报表的文件
    private void ReadCRV(cryatalReportViewer crv,File file)
    {
      string strName=file.PostedFile.FileName;
      if(strName.Trim()!="")
      {
        crv.ReportSource=strName
        Session["fileName"]=strName;
      }
    }
    在B/S中要防止数据源的丢失
    priavte void Page_Load(object sender,System.EventArgs e)
    {
      if(Session["fileName"]!=null)
      {
        crv.ReportSource=Session["fileName"].ToString();
      }
    }
7. 假如直接从数据库中读取数据,采用PULL模式可能出现错误(登录的用户名和密码不对)
   private void ReadCRV(CrystalReportViewer crv,CrystalReport cr)
   {
      ReportDocument reportDoc=new ReportDocument();
      reportDoc.Load(Server.MapPath(cr));//要加载的rpt文件的名字
      //解决登录的问题
      TableLogOnInfo logonInfo = new TableLogOnInfo();
      foreach(Table tb in ReportDoc.Database.Tables)
      {
        logonInfo=tb.LogOnInfo;
        logonInfo.ConnectionInfo.ServerName="(loacl)";
        logonInfo.ConnectionInfo.DatabaseName="Pubs";
        logonInfo.ConnectionInfo.UserId="sa";
        logonInfo.ConnectionInfo.Password="";
        tb.ApplyLogOnInfo(logonInfo);
      }
      crv.ReportSource=reportDoc;
   }
8. 采用Push模式,直接在数据源读取
   private void BindReport(CrystalReportViewer crv)
   {
     string strProvider="Server=(local);DataBase=pubs;uid=sa;pwd=";
     CrystalReport cr=new CrystalReport();
     DataSet ds=new DataSet();
     SqlConnection conn=new SqlConnection(strProvider);
     conn.open();
     string strSql="select * from jobs";
     SqlDataAdapter dap=new SqlDataAdapter(strSql,conn);
     adp.Fill(ds,"jobs");
     cr.SetDataSource(ds);
     crv.ReportSource=cr;
   }
9. 导出水晶报表的文件
   private void ExportCrv(CrystalReport cr)
   {
      DiskFileDestionOptions dOpt=new DiskFileDestionOptions();
      cr.ExportOptions.ExportDestinationType=ExportDestinationType.DiskFile();
      cr.ExportOptions.ExportFormatType= ExportFormatType.PortableDocFormat;
      dOpt.DiskFileName="C:\output.pdf";
      cr.ExportOptions.DestinationOptions=dOpt;
      cr.Export();
   
   }
   private void ExportCrv(CrystalReport cr,string strType,string strPath)
   {
      DiskFileDestionOptions dOpt=new DiskFileDestionOptions();
      cr.ExportOptions.ExportDestinationType=ExportDestinationType.DiskFile();
      switch(strType)
      {
         case "RTF":
           cr.ExportOptions.ExportFormatType=ExportFormatType.RichText;
           dOpt.DiskFileName=strPath;
           break;
         case "PDF":
           cr.ExportOptions.ExportFormatType=ExportFormatType.PortableDocFormat;
           dOpt.DiskFileName=strPath;
           break;
         case "DOC":
           cr.ExportOptions.ExportFormatType=ExportFormatType.WordForWindows;
           dOpt.DiskFileName=strPath;
           break;
         case "XLS":
           cr.ExportOptions.ExportFormatType=ExportFormatType.Excel;
           dOpt.DiskFileName=strPath;
           break;
         default;
         break;
        
      }
      cr.ExportOptions.DestinationOptions=dOpt;
      cr.Export();

   }
10 B/S下水晶报表的打印
   priavte void PrintCRV(CrystalReport cr)
   {
     stringstrPrinterName=@"printName";
     PageMargins margins=cr.PrintOptions.PageMargins;
     margins.bottomMargin = 250;
     margins.leftMargin = 350;
     margins.rightMargin = 350;
     margins.topMargin = 450;
     cr.PrintOptions.ApplyPageMargins(margins);
     cr.PrintOptions.printerName=strPrinterName;
     cr.PrintToPrinter(1,false,0,0)//参数设置为0,表示打印所用页
   }

96.全屏幕截取


[DllImport("gdi32.dll")]
private static extern int BitBlt(IntPtr hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,IntPtr hdcSrc,int nXSrc,int nYSrc,UInt32 dwRop);
            //this.Hide();//如果你不想截取的图象中有此应用程序
            //Thread.Sleep(1000);
            Rectangle rect = new Rectangle();
            rect = Screen.GetWorkingArea(this);//获得当前屏幕的大小
            Graphics g = this.CreateGraphics();
//创建一个以当前屏幕为模板的图象
            Image myimage = new Bitmap(rect.Width, rect.Height, g);
//第二种得到全屏坐标的方法
         // Image myimage = new Bitmap(Screen.PrimaryScreen.Bounds.Width,Screen.PrimaryScreen.Bounds.Height,g);
//创建以屏幕大小为标准的位图
            Graphics gg = Graphics.FromImage(myimage);
            IntPtr dc = g.GetHdc();//得到屏幕的DC
            IntPtr dcdc = gg.GetHdc();//得到Bitmap的DC  
         BitBlt(dcdc, 0, 0, rect.Width, rect.Height, dc, 0, 0, 13369376);
//调用此API函数,实现屏幕捕获
            g.ReleaseHdc(dc);//释放掉屏幕的DC
            gg.ReleaseHdc(dcdc);//释放掉Bitmap的DC  
            myimage.Save(Application.StartupPath + @"\bob.jpg",    ImageFormat.Jpeg);//以JPG文件格式来保存
            this.Show();

97.区域截幕

public static Bitmap GetPartScreen(Point P1,Point P2,bool Full)
{
    IntPtr hscrdc,hmemdc;
    IntPtr hbitmap,holdbitmap;
    int nx,ny,nx2,ny2;
    nx=ny=nx2=ny2=0;
    int nwidth, nheight;
    int xscrn, yscrn;
    hscrdc = CreateDC("DISPLAY", null, null, 0);//创建DC句柄
    hmemdc = CreateCompatibleDC(hscrdc);//创建一个内存DC
    xscrn = GetDeviceCaps(hscrdc, GetDeviceCapsIndex.HORZRES);//获取屏幕宽度
    yscrn = GetDeviceCaps(hscrdc, GetDeviceCapsIndex.VERTRES);//获取屏幕高度
    if(Full)//如果是截取整个屏幕
    {
        nx = 0;
        ny = 0;
        nx2 = xscrn;
        ny2 = yscrn;
    }
    else
    {
        nx = P1.X;
        ny = P1.Y;
        nx2 =P2.X;
        ny2 =P2.Y;
        //检查数值合法性
        if(nx<0)nx = 0;
        if(ny<0)ny = 0;
        if(nx2>xscrn)nx2 = xscrn;
        if(ny2>yscrn)ny2 = yscrn;
    }
    nwidth = nx2 - nx;//截取范围的宽度
    nheight = ny2 - ny;//截取范围的高度
    hbitmap = CreateCompatibleBitmap(hscrdc, nwidth, nheight);//从内存DC复制到hbitmap句柄
    holdbitmap = SelectObject(hmemdc, hbitmap);
    BitBlt(hmemdc, 0, 0, nwidth, nheight,hscrdc, nx, ny,(UInt32)0xcc0020);
    hbitmap = SelectObject(hmemdc, holdbitmap);
    DeleteDC(hscrdc);//删除用过的对象
    DeleteDC(hmemdc);//删除用过的对象
    return Bitmap.FromHbitmap(hbitmap);//用Bitmap.FromHbitmap从hbitmap返回Bitmap
}

98.计算文件MD5值

string path = %%1;
FileStream fs = new FileStream(path,FileMode.Open,FileAccess.Read);
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte [] md5byte = md5.ComputeHash(fs);
int i,j;
StringBuilder sb = new StringBuilder(16);
foreach (byte b in md5byte)
{
    i = Convert.ToInt32(b);
   j = i >> 4;
   sb.Append(Convert.ToString(j,16));
   j = ((i << 4) & 0x00ff) >> 4;
   sb.Append(Convert.ToString(j,16));
}
string %%2=sb.ToString();

99.计算获取文件夹中文件的MD5值

bool b=false;
string path = (%%2.LastIndexOf("\") == %%2.Length - 1) ? %%2 : %%2 + "\";
string parent = Path.GetDirectoryName(%%1);
Directory.CreateDirectory(path + Path.GetFileName(%%1));
DirectoryInfo dir = new DirectoryInfo((%%1.LastIndexOf("\") == %%1.Length - 1) ? %%1 : %%1 + "\");
FileSystemInfo[] fileArr = dir.GetFileSystemInfos();
Queue<FileSystemInfo> Folders = new Queue<FileSystemInfo>(dir.GetFileSystemInfos());
while (Folders.Count > 0)
{
    FileSystemInfo tmp = Folders.Dequeue();
    FileInfo f = tmp as FileInfo;
    if (b && f == null)
    {
        DirectoryInfo d = tmp as DirectoryInfo;
        Directory.CreateDirectory(d.FullName.Replace((parent.LastIndexOf("\") == parent.Length - 1) ? parent : parent + "\", path));
        foreach (FileSystemInfo fi in d.GetFileSystemInfos())
        {
            Folders.Enqueue(fi);
        }
    }
    else
    {
        FileStream fs = new FileStream(f,FileMode.Open,FileAccess.Read);
        MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
        byte [] md5byte = md5.ComputeHash(fs);
        int i,j;
        StringBuilder sb = new StringBuilder(16);
        foreach (byte b in md5byte)
        {
            i = Convert.ToInt32(b);
           j = i >> 4;
           sb.Append(Convert.ToString(j,16));
           j = ((i << 4) & 0x00ff) >> 4;
           sb.Append(Convert.ToString(j,16));
        }
        string %%3=sb.ToString();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#文件操作中的相对路径是指相对于当前工作目录的路径。当前工作目录是指程序运行时所在的目录。在C#中,可以使用System.IO.Path类的一些方法来处理文件路径操作。具体来说,可以使用Path类的Combine方法来拼接路径,使用GetDirectoryName方法来获取路径的目录部分,使用GetFileName方法来获取路径的文件名部分,使用GetExtension方法来获取路径的扩展名部分等等。 举个例子,假设当前工作目录是"D:\MyProject",而需要操作文件在该目录下的"Data"文件夹中的"sample.txt"文件。那么可以使用Path类的Combine方法来拼接路径,代码如下: string filePath = Path.Combine("Data", "sample.txt"); 这样就得到了相对路径"Data\sample.txt"。在进行文件操作时,可以使用这个相对路径来指定要操作文件。 需要注意的是,相对路径是相对于当前工作目录的,所以在不同的环境下,当前工作目录可能会有所不同。为了确保代码的可移植性,可以使用Path类的GetFullPath方法来获取完整的路径,代码如下: string fullPath = Path.GetFullPath(filePath); 这样就可以获取到"D:\MyProject\Data\sample.txt"这个完整的路径,无论当前工作目录是什么。 综上所述,C#文件操作中的相对路径是相对于当前工作目录的路径。可以使用Path类的一些方法来处理文件路径操作,如拼接路径、获取目录部分、获取文件名部分等。在进行文件操作时,可以使用相对路径来指定要操作文件。为了确保代码的可移植性,可以使用GetFullPath方法来获取完整的路径。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [浅析C#文件路径的操作](https://download.csdn.net/download/weixin_38715097/12790167)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C#操作文件系统绝对路径和相对路径](https://download.csdn.net/download/zhwcd/10670331)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [C#中winform使用相对路径读取文件的方法](https://download.csdn.net/download/weixin_38660069/13991652)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值