C# FTPClient--FTP操作帮助类,上传下载,文件,目录操作
FROM :http://www.sufeinet.com/forum.php?mod=viewthread&tid=1736&extra=page%3D1%26filter%3Dtypeid%26typeid%3D275%26typeid%3D275
这个类是关于FTP客户端的操作
1.构造函数
2.字段 服务器账户密码
3.属性
4.链接
5.传输模式
6.文件操作
7.上传和下载
8.目录操作
9.内容函数
- using System;
- using System.Net;
- using System.IO;
- using System.Text;
- using System.Net.Sockets;
- using System.Threading;
- namespace DotNet.Utilities
- {
- /// <summary>
- /// FTP 操作类客户端
- /// </summary>
- public class FTPClient
- {
- public static object obj = new object();
- #region 构造函数
- /// <summary>
- /// 缺省构造函数
- /// </summary>
- public FTPClient()
- {
- strRemoteHost = "";
- strRemotePath = "";
- strRemoteUser = "";
- strRemotePass = "";
- strRemotePort = 21;
- bConnected = false;
- }
- /// <summary>
- /// 构造函数
- /// </summary>
- public FTPClient(string remoteHost, string remotePath, string remoteUser, string remotePass, int remotePort)
- {
- strRemoteHost = remoteHost;
- strRemotePath = remotePath;
- strRemoteUser = remoteUser;
- strRemotePass = remotePass;
- strRemotePort = remotePort;
- Connect();
- }
- #endregion
- #region 字段
- private int strRemotePort;
- private Boolean bConnected;
- private string strRemoteHost;
- private string strRemotePass;
- private string strRemoteUser;
- private string strRemotePath;
- /// <summary>
- /// 服务器返回的应答信息(包含应答码)
- /// </summary>
- private string strMsg;
- /// <summary>
- /// 服务器返回的应答信息(包含应答码)
- /// </summary>
- private string strReply;
- /// <summary>
- /// 服务器返回的应答码
- /// </summary>
- private int iReplyCode;
- /// <summary>
- /// 进行控制连接的socket
- /// </summary>
- private Socket socketControl;
- /// <summary>
- /// 传输模式
- /// </summary>
- private TransferType trType;
- /// <summary>
- /// 接收和发送数据的缓冲区
- /// </summary>
- private static int BLOCK_SIZE = 512;
- /// <summary>
- /// 编码方式
- /// </summary>
- Encoding ASCII = Encoding.ASCII;
- /// <summary>
- /// 字节数组
- /// </summary>
- Byte[] buffer = new Byte[BLOCK_SIZE];
- #endregion
- #region 属性
- /// <summary>
- /// FTP服务器IP地址
- /// </summary>
- public string RemoteHost
- {
- get
- {
- return strRemoteHost;
- }
- set
- {
- strRemoteHost = value;
- }
- }
- /// <summary>
- /// FTP服务器端口
- /// </summary>
- public int RemotePort
- {
- get
- {
- return strRemotePort;
- }
- set
- {
- strRemotePort = value;
- }
- }
- /// <summary>
- /// 当前服务器目录
- /// </summary>
- public string RemotePath
- {
- get
- {
- return strRemotePath;
- }
- set
- {
- strRemotePath = value;
- }
- }
- /// <summary>
- /// 登录用户账号
- /// </summary>
- public string RemoteUser
- {
- set
- {
- strRemoteUser = value;
- }
- }
- /// <summary>
- /// 用户登录密码
- /// </summary>
- public string RemotePass
- {
- set
- {
- strRemotePass = value;
- }
- }
- /// <summary>
- /// 是否登录
- /// </summary>
- public bool Connected
- {
- get
- {
- return bConnected;
- }
- }
- #endregion
- #region 链接
- /// <summary>
- /// 建立连接
- /// </summary>
- public void Connect()
- {
- lock (obj)
- {
- socketControl = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- IPEndPoint ep = new IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort);
- try
- {
- socketControl.Connect(ep);
- }
- catch (Exception)
- {
- throw new IOException("不能连接ftp服务器");
- }
- }
- ReadReply();
- if (iReplyCode != 220)
- {
- DisConnect();
- throw new IOException(strReply.Substring(4));
- }
- SendCommand("USER " + strRemoteUser);
- if (!(iReplyCode == 331 || iReplyCode == 230))
- {
- CloseSocketConnect();
- throw new IOException(strReply.Substring(4));
- }
- if (iReplyCode != 230)
- {
- SendCommand("PASS " + strRemotePass);
- if (!(iReplyCode == 230 || iReplyCode == 202))
- {
- CloseSocketConnect();
- throw new IOException(strReply.Substring(4));
- }
- }
- bConnected = true;
- ChDir(strRemotePath);
- }
- /// <summary>
- /// 关闭连接
- /// </summary>
- public void DisConnect()
- {
- if (socketControl != null)
- {
- SendCommand("QUIT");
- }
- CloseSocketConnect();
- }
- #endregion
- #region 传输模式
- /// <summary>
- /// 传输模式:二进制类型、ASCII类型
- /// </summary>
- public enum TransferType { Binary, ASCII };
- /// <summary>
- /// 设置传输模式
- /// </summary>
- /// <param name="ttType">传输模式</param>
- public void SetTransferType(TransferType ttType)
- {
- if (ttType == TransferType.Binary)
- {
- SendCommand("TYPE I");//binary类型传输
- }
- else
- {
- SendCommand("TYPE A");//ASCII类型传输
- }
- if (iReplyCode != 200)
- {
- throw new IOException(strReply.Substring(4));
- }
- else
- {
- trType = ttType;
- }
- }
- /// <summary>
- /// 获得传输模式
- /// </summary>
- /// <returns>传输模式</returns>
- public TransferType GetTransferType()
- {
- return trType;
- }
- #endregion
- #region 文件操作
- /// <summary>
- /// 获得文件列表
- /// </summary>
- /// <param name="strMask">文件名的匹配字符串</param>
- public string[] Dir(string strMask)
- {
- if (!bConnected)
- {
- Connect();
- }
- Socket socketData = CreateDataSocket();
- SendCommand("NLST " + strMask);
- if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226))
- {
- throw new IOException(strReply.Substring(4));
- }
- strMsg = "";
- Thread.Sleep(2000);
- while (true)
- {
- int iBytes = socketData.Receive(buffer, buffer.Length, 0);
- strMsg += ASCII.GetString(buffer, 0, iBytes);
- if (iBytes < buffer.Length)
- {
- break;
- }
- }
- char[] seperator = { '\n' };
- string[] strsFileList = strMsg.Split(seperator);
- socketData.Close(); //数据socket关闭时也会有返回码
- if (iReplyCode != 226)
- {
- ReadReply();
- if (iReplyCode != 226)
- {
- throw new IOException(strReply.Substring(4));
- }
- }
- return strsFileList;
- }
- public void newPutByGuid(string strFileName, string strGuid)
- {
- if (!bConnected)
- {
- Connect();
- }
- string str = strFileName.Substring(0, strFileName.LastIndexOf("\\"));
- string strTypeName = strFileName.Substring(strFileName.LastIndexOf("."));
- strGuid = str + "\\" + strGuid;
- Socket socketData = CreateDataSocket();
- SendCommand("STOR " + Path.GetFileName(strGuid));
- if (!(iReplyCode == 125 || iReplyCode == 150))
- {
- throw new IOException(strReply.Substring(4));
- }
- FileStream input = new FileStream(strGuid, FileMode.Open);
- input.Flush();
- int iBytes = 0;
- while ((iBytes = input.Read(buffer, 0, buffer.Length)) > 0)
- {
- socketData.Send(buffer, iBytes, 0);
- }
- input.Close();
- if (socketData.Connected)
- {
- socketData.Close();
- }
- if (!(iReplyCode == 226 || iReplyCode == 250))
- {
- ReadReply();
- if (!(iReplyCode == 226 || iReplyCode == 250))
- {
- throw new IOException(strReply.Substring(4));
- }
- }
- }
- /// <summary>
- /// 获取文件大小
- /// </summary>
- /// <param name="strFileName">文件名</param>
- /// <returns>文件大小</returns>
- public long GetFileSize(string strFileName)
- {
- if (!bConnected)
- {
- Connect();
- }
- SendCommand("SIZE " + Path.GetFileName(strFileName));
- long lSize = 0;
- if (iReplyCode == 213)
- {
- lSize = Int64.Parse(strReply.Substring(4));
- }
- else
- {
- throw new IOException(strReply.Substring(4));
- }
- return lSize;
- }
- /// <summary>
- /// 获取文件信息
- /// </summary>
- /// <param name="strFileName">文件名</param>
- /// <returns>文件大小</returns>
- public string GetFileInfo(string strFileName)
- {
- if (!bConnected)
- {
- Connect();
- }
- Socket socketData = CreateDataSocket();
- SendCommand("LIST " + strFileName);
- string strResult = "";
- if (!(iReplyCode == 150 || iReplyCode == 125
- || iReplyCode == 226 || iReplyCode == 250))
- {
- throw new IOException(strReply.Substring(4));
- }
- byte[] b = new byte[512];
- MemoryStream ms = new MemoryStream();
- while (true)
- {
- int iBytes = socketData.Receive(b, b.Length, 0);
- ms.Write(b, 0, iBytes);
- if (iBytes <= 0)
- {
- break;
- }
- }
- byte[] bt = ms.GetBuffer();
- strResult = System.Text.Encoding.ASCII.GetString(bt);
- ms.Close();
- return strResult;
- }
- /// <summary>
- /// 删除
- /// </summary>
- /// <param name="strFileName">待删除文件名</param>
- public void Delete(string strFileName)
- {
- if (!bConnected)
- {
- Connect();
- }
- SendCommand("DELE " + strFileName);
- if (iReplyCode != 250)
- {
- throw new IOException(strReply.Substring(4));
- }
- }
- /// <summary>
- /// 重命名(如果新文件名与已有文件重名,将覆盖已有文件)
- /// </summary>
- /// <param name="strOldFileName">旧文件名</param>
- /// <param name="strNewFileName">新文件名</param>
- public void Rename(string strOldFileName, string strNewFileName)
- {
- if (!bConnected)
- {
- Connect();
- }
- SendCommand("RNFR " + strOldFileName);
- if (iReplyCode != 350)
- {
- throw new IOException(strReply.Substring(4));
- }
- // 如果新文件名与原有文件重名,将覆盖原有文件
- SendCommand("RNTO " + strNewFileName);
- if (iReplyCode != 250)
- {
- throw new IOException(strReply.Substring(4));
- }
- }
- #endregion
- #region 上传和下载
- /// <summary>
- /// 下载一批文件
- /// </summary>
- /// <param name="strFileNameMask">文件名的匹配字符串</param>
- /// <param name="strFolder">本地目录(不得以\结束)</param>
- public void Get(string strFileNameMask, string strFolder)
- {
- if (!bConnected)
- {
- Connect();
- }
- string[] strFiles = Dir(strFileNameMask);
- foreach (string strFile in strFiles)
- {
- if (!strFile.Equals(""))//一般来说strFiles的最后一个元素可能是空字符串
- {
- Get(strFile, strFolder, strFile);
- }
- }
- }
- /// <summary>
- /// 下载一个文件
- /// </summary>
- /// <param name="strRemoteFileName">要下载的文件名</param>
- /// <param name="strFolder">本地目录(不得以\结束)</param>
- /// <param name="strLocalFileName">保存在本地时的文件名</param>
- public void Get(string strRemoteFileName, string strFolder, string strLocalFileName)
- {
- Socket socketData = CreateDataSocket();
- try
- {
- if (!bConnected)
- {
- Connect();
- }
- SetTransferType(TransferType.Binary);
- if (strLocalFileName.Equals(""))
- {
- strLocalFileName = strRemoteFileName;
- }
- SendCommand("RETR " + strRemoteFileName);
- if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226 || iReplyCode == 250))
- {
- throw new IOException(strReply.Substring(4));
- }
- FileStream output = new FileStream(strFolder + "\\" + strLocalFileName, FileMode.Create);
- while (true)
- {
- int iBytes = socketData.Receive(buffer, buffer.Length, 0);
- output.Write(buffer, 0, iBytes);
- if (iBytes <= 0)
- {
- break;
- }
- }
- output.Close();
- if (socketData.Connected)
- {
- socketData.Close();
- }
- if (!(iReplyCode == 226 || iReplyCode == 250))
- {
- ReadReply();
- if (!(iReplyCode == 226 || iReplyCode == 250))
- {
- throw new IOException(strReply.Substring(4));
- }
- }
- }
- catch
- {
- socketData.Close();
- socketData = null;
- socketControl.Close();
- bConnected = false;
- socketControl = null;
- }
- }
- /// <summary>
- /// 下载一个文件
- /// </summary>
- /// <param name="strRemoteFileName">要下载的文件名</param>
- /// <param name="strFolder">本地目录(不得以\结束)</param>
- /// <param name="strLocalFileName">保存在本地时的文件名</param>
- public void GetNoBinary(string strRemoteFileName, string strFolder, string strLocalFileName)
- {
- if (!bConnected)
- {
- Connect();
- }
- if (strLocalFileName.Equals(""))
- {
- strLocalFileName = strRemoteFileName;
- }
- Socket socketData = CreateDataSocket();
- SendCommand("RETR " + strRemoteFileName);
- if (!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226 || iReplyCode == 250))
- {
- throw new IOException(strReply.Substring(4));
- }
- FileStream output = new FileStream(strFolder + "\\" + strLocalFileName, FileMode.Create);
- while (true)
- {
- int iBytes = socketData.Receive(buffer, buffer.Length, 0);
- output.Write(buffer, 0, iBytes);
- if (iBytes <= 0)
- {
- break;
- }
- }
- output.Close();
- if (socketData.Connected)
- {
- socketData.Close();
- }
- if (!(iReplyCode == 226 || iReplyCode == 250))
- {
- ReadReply();
- if (!(iReplyCode == 226 || iReplyCode == 250))
- {
- throw new IOException(strReply.Substring(4));
- }
- }
- }
- /// <summary>
- /// 上传一批文件
- /// </summary>
- /// <param name="strFolder">本地目录(不得以\结束)</param>
- /// <param name="strFileNameMask">文件名匹配字符(可以包含*和?)</param>
- public void Put(string strFolder, string strFileNameMask)
- {
- string[] strFiles = Directory.GetFiles(strFolder, strFileNameMask);
- foreach (string strFile in strFiles)
- {
- Put(strFile);
- }
- }
- /// <summary>
- /// 上传一个文件
- /// </summary>
- /// <param name="strFileName">本地文件名</param>
- public void Put(string strFileName)
- {
- if (!bConnected)
- {
- Connect();
- }
- Socket socketData = CreateDataSocket();
- if (Path.GetExtension(strFileName) == "")
- SendCommand("STOR " + Path.GetFileNameWithoutExtension(strFileName));
- else
- SendCommand("STOR " + Path.GetFileName(strFileName));
- if (!(iReplyCode == 125 || iReplyCode == 150))
- {
- throw new IOException(strReply.Substring(4));
- }
- FileStream input = new FileStream(strFileName, FileMode.Open);
- int iBytes = 0;
- while ((iBytes = input.Read(buffer, 0, buffer.Length)) > 0)
- {
- socketData.Send(buffer, iBytes, 0);
- }
- input.Close();
- if (socketData.Connected)
- {
- socketData.Close();
- }
- if (!(iReplyCode == 226 || iReplyCode == 250))
- {
- ReadReply();
- if (!(iReplyCode == 226 || iReplyCode == 250))
- {
- throw new IOException(strReply.Substring(4));
- }
- }
- }
- /// <summary>
- /// 上传一个文件
- /// </summary>
- /// <param name="strFileName">本地文件名</param>
- public void PutByGuid(string strFileName, string strGuid)
- {
- if (!bConnected)
- {
- Connect();
- }
- string str = strFileName.Substring(0, strFileName.LastIndexOf("\\"));
- string strTypeName = strFileName.Substring(strFileName.LastIndexOf("."));
- strGuid = str + "\\" + strGuid;
- System.IO.File.Copy(strFileName, strGuid);
- System.IO.File.SetAttributes(strGuid, System.IO.FileAttributes.Normal);
- Socket socketData = CreateDataSocket();
- SendCommand("STOR " + Path.GetFileName(strGuid));
- if (!(iReplyCode == 125 || iReplyCode == 150))
- {
- throw new IOException(strReply.Substring(4));
- }
- FileStream input = new FileStream(strGuid, FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
- int iBytes = 0;
- while ((iBytes = input.Read(buffer, 0, buffer.Length)) > 0)
- {
- socketData.Send(buffer, iBytes, 0);
- }
- input.Close();
- File.Delete(strGuid);
- if (socketData.Connected)
- {
- socketData.Close();
- }
- if (!(iReplyCode == 226 || iReplyCode == 250))
- {
- ReadReply();
- if (!(iReplyCode == 226 || iReplyCode == 250))
- {
- throw new IOException(strReply.Substring(4));
- }
- }
- }
- #endregion
- #region 目录操作
- /// <summary>
- /// 创建目录
- /// </summary>
- /// <param name="strDirName">目录名</param>
- public void MkDir(string strDirName)
- {
- if (!bConnected)
- {
- Connect();
- }
- SendCommand("MKD " + strDirName);
- if (iReplyCode != 257)
- {
- throw new IOException(strReply.Substring(4));
- }
- }
- /// <summary>
- /// 删除目录
- /// </summary>
- /// <param name="strDirName">目录名</param>
- public void RmDir(string strDirName)
- {
- if (!bConnected)
- {
- Connect();
- }
- SendCommand("RMD " + strDirName);
- if (iReplyCode != 250)
- {
- throw new IOException(strReply.Substring(4));
- }
- }
- /// <summary>
- /// 改变目录
- /// </summary>
- /// <param name="strDirName">新的工作目录名</param>
- public void ChDir(string strDirName)
- {
- if (strDirName.Equals(".") || strDirName.Equals(""))
- {
- return;
- }
- if (!bConnected)
- {
- Connect();
- }
- SendCommand("CWD " + strDirName);
- if (iReplyCode != 250)
- {
- throw new IOException(strReply.Substring(4));
- }
- this.strRemotePath = strDirName;
- }
- #endregion
- #region 内部函数
- /// <summary>
- /// 将一行应答字符串记录在strReply和strMsg,应答码记录在iReplyCode
- /// </summary>
- private void ReadReply()
- {
- strMsg = "";
- strReply = ReadLine();
- iReplyCode = Int32.Parse(strReply.Substring(0, 3));
- }
- /// <summary>
- /// 建立进行数据连接的socket
- /// </summary>
- /// <returns>数据连接socket</returns>
- private Socket CreateDataSocket()
- {
- SendCommand("PASV");
- if (iReplyCode != 227)
- {
- throw new IOException(strReply.Substring(4));
- }
- int index1 = strReply.IndexOf('(');
- int index2 = strReply.IndexOf(')');
- string ipData = strReply.Substring(index1 + 1, index2 - index1 - 1);
- int[] parts = new int[6];
- int len = ipData.Length;
- int partCount = 0;
- string buf = "";
- for (int i = 0; i < len && partCount <= 6; i++)
- {
- char ch = Char.Parse(ipData.Substring(i, 1));
- if (Char.IsDigit(ch))
- buf += ch;
- else if (ch != ',')
- {
- throw new IOException("Malformed PASV strReply: " + strReply);
- }
- if (ch == ',' || i + 1 == len)
- {
- try
- {
- parts[partCount++] = Int32.Parse(buf);
- buf = "";
- }
- catch (Exception)
- {
- throw new IOException("Malformed PASV strReply: " + strReply);
- }
- }
- }
- string ipAddress = parts[0] + "." + parts[1] + "." + parts[2] + "." + parts[3];
- int port = (parts[4] << 8) + parts[5];
- Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- IPEndPoint ep = new IPEndPoint(IPAddress.Parse(ipAddress), port);
- try
- {
- s.Connect(ep);
- }
- catch (Exception)
- {
- throw new IOException("无法连接ftp服务器");
- }
- return s;
- }
- /// <summary>
- /// 关闭socket连接(用于登录以前)
- /// </summary>
- private void CloseSocketConnect()
- {
- lock (obj)
- {
- if (socketControl != null)
- {
- socketControl.Close();
- socketControl = null;
- }
- bConnected = false;
- }
- }
- /// <summary>
- /// 读取Socket返回的所有字符串
- /// </summary>
- /// <returns>包含应答码的字符串行</returns>
- private string ReadLine()
- {
- lock (obj)
- {
- while (true)
- {
- int iBytes = socketControl.Receive(buffer, buffer.Length, 0);
- strMsg += ASCII.GetString(buffer, 0, iBytes);
- if (iBytes < buffer.Length)
- {
- break;
- }
- }
- }
- char[] seperator = { '\n' };
- string[] mess = strMsg.Split(seperator);
- if (strMsg.Length > 2)
- {
- strMsg = mess[mess.Length - 2];
- }
- else
- {
- strMsg = mess[0];
- }
- if (!strMsg.Substring(3, 1).Equals(" ")) //返回字符串正确的是以应答码(如220开头,后面接一空格,再接问候字符串)
- {
- return ReadLine();
- }
- return strMsg;
- }
- /// <summary>
- /// 发送命令并获取应答码和最后一行应答字符串
- /// </summary>
- /// <param name="strCommand">命令</param>
- public void SendCommand(String strCommand)
- {
- lock (obj)
- {
- Byte[] cmdBytes = Encoding.ASCII.GetBytes((strCommand + "\r\n").ToCharArray());
- socketControl.Send(cmdBytes, cmdBytes.Length, 0);
- Thread.Sleep(500);
- ReadReply();
- }
- }
- #endregion
- }
- }
C# FTPClient--FTP操作帮助类,上传下载,文件,目录操作的更多相关文章
- 在Windows上使用终端模拟程序连接操作Linux以及上传下载文件
在Windows上使用终端模拟程序连接操作Linux以及上传下载文件 [很简单,就是一个工具的使用而已,放这里是做个笔记.] 刚买的云主机,或者是虚拟机里安装的Linux系统,可能会涉及到在windo ...
- vb.net FTP上传下载,目录操作
https://blog.csdn.net/dzweather/article/details/51429107 FtpWebRequest与FtpWebResponse类用来与特定FTP服务器进行沟 ...
- Android和FTP服务器交互,上传下载文件(实例demo)
今天同学说他备份了联系人的数据放在一个文件里,想把它存到服务器上,以便之后可以进行下载恢复..于是帮他写了个上传,下载文件的demo 主要是 跟FTP服务器打交道-因为这个东东有免费的可以身亲哈 1. ...
- C# FluentFTP类上传下载文件
前言:最近要实现从FTP服务器下载和上传文件,在网上搜了一下据说 FluentFTP 是个客户端FTP功能的实现,使用还比较顺畅,所以对此展开研究,无奈网上给出的案例并没有想象中的那么简洁,所以想着自 ...
- shell通过ftp实现上传/下载文件
直接代码,shell文件名为testFtptool.sh: #!/bin/bash ########################################################## ...
- linux下常用FTP命令 上传下载文件【转】
1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码,分别输入用户名和相应密码 ...
- SFTP上传下载文件、文件夹常用操作
SFTP上传下载文件.文件夹常用操作 1.查看上传下载目录lpwd 2.改变上传和下载的目录(例如D盘):lcd d:/ 3.查看当前路径pwd 4.下载文件(例如我要将服务器上tomcat的日志文 ...
- FTP上传下载文件(函数简易版)
FTP上传下载文件(函数简易版) # 服务端 import socket import json import hashlib import struct import os user_dic = { ...
- 向linux服务器上传下载文件方式收集
向linux服务器上传下载文件方式收集 1. scp [优点]简单方便,安全可靠:支持限速参数[缺点]不支持排除目录[用法] scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ...
- 【liunx命令】上传下载文件的方法
scp 帮助命令: man scp scp功能: 下载远程文件或者目录到本地, 如果想上传或者想下载目录,最好的办法是采用tar压缩一下,是最明智的选择. 从远程主机 下载东西到 本地电脑 ...
随机推荐
- leetcode之Largest Rectangle in Histogram
问题来源:Largest Rectangle in Histogram 问题描述:给定一个长度为n的直方图,我们可以在直方图高低不同的长方形之间画一个更大的长方形,求该长方形的最大面积.例如,给定下述 ...
- [CSDN_Markdown]Markdown基本语法2
简介 前文 Markdown基本语法 中介绍了Markdown的基本语法,知道那些基本的语法,实际上已经可以写纯文本的博客了.对我们这群写代码的人或者将要写代码的人来说,貌似这些还不够,我们还希望能插 ...
- Angular2入坑指南
序 对后端开发来说,前端是神秘的,眼花缭乱的技术,繁多的框架,出名的不出名的好几百种,看是"繁荣",其实显得杂乱无章,但是我们在做开发的时候,技术选型还是主流的那么几个:浅析ang ...
- springMVC源码分析--AbstractHandlerMethodMapping获取url和HandlerMethod对应关系(十)
在之前的博客springMVC源码分析--AbstractHandlerMapping(二)中我们介绍了AbstractHandlerMethodMapping的父类AbstractHandlerMa ...
- 如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,求这个队列中从队列投到队列尾的元素个数(包含队列头、队列尾)。
#include <iostream> using namespace std; //循环队列(少用一个空间)长度 #define M (8+1) typedef struct node ...
- com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field 异常
分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519) 1.1.1. 前言 近期在使用ObjectMapper对象将jso ...
- Java进阶(四十二)Java中多线程使用匿名内部类的方式进行创建3种方式
Java中多线程使用匿名内部类的方式进行创建3种方式 package cn.edu.ujn.demo; // 匿名内部类的格式: public class ThreadDemo { public st ...
- 使用Myeclipse10.0自动生成搭建SSH框架(数据库表自动反向转换成Hibernate实体)实现用户登陆
我这里使用的数据库是mysql5.0 数据是上课用的.这些都不是重点,重要的是学会这个方法: 创建好数据库: create database jboadefault character set utf ...
- java.util.ServiceLoader使用
近期在项目中需要实现能在配置文件中定义多个统一接口类型的类,可以在程序中获取到所有配置的类,刚开始打算配置到properties中,然后去程序读取,感觉这种方式不太灵活,于是,研究研究java中有没有 ...
- 第一行代码阅读笔记---AndroidMainfest.xml分析
按照这本书的指引,我随作者一样创建了一个安卓应用,开始了安卓开发的启程. 找到AndroidMainfest.xml这个文件,打开后看到了我创建的Activity在这个文件里被成功注册,文件内容如下: ...