fix DartAPI
This commit is contained in:
73
Crawler.cs
73
Crawler.cs
@@ -5,6 +5,8 @@ using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Net.Http.Headers;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
@@ -15,7 +17,7 @@ namespace NewsCrawler
|
||||
{
|
||||
NewsForm m_Listener = null;
|
||||
DateTime m_Today = DateTime.Now;
|
||||
int m_iDartAPIRetry = 5;
|
||||
int m_iDartAPIRetry = 10;
|
||||
Regex m_ProfitChange = new Regex("30%.*이상.*(변경|변동)");
|
||||
|
||||
public Crawler(NewsForm Listener)
|
||||
@@ -164,7 +166,7 @@ namespace NewsCrawler
|
||||
string strTitle = item.SelectSingleNode(".//a").InnerText.Trim();
|
||||
string strTime = item.SelectSingleNode(".//span[contains(@class, 'flash_press')]").InnerText.Trim();
|
||||
string strURL = item.SelectSingleNode(".//a").GetAttributeValue("href", "");
|
||||
strURL="http://www.etoday.co.kr/news/section/newsview.php?idxno="+Regex.Replace(strURL, @"\D", "");
|
||||
strURL="https://www.etoday.co.kr/news/section/newsview.php?idxno="+Regex.Replace(strURL, @"\D", "");
|
||||
|
||||
if(Regex.IsMatch(strTime, @"\d+/\d+")==true)
|
||||
{
|
||||
@@ -193,7 +195,7 @@ namespace NewsCrawler
|
||||
{
|
||||
try
|
||||
{
|
||||
HttpWebRequest HttpReq = WebRequest.Create("http://www.etoday.co.kr/news/flash/flash_list.php?tab=1") as HttpWebRequest;
|
||||
HttpWebRequest HttpReq = WebRequest.Create("https://www.etoday.co.kr//news/flashnews/flash_list") as HttpWebRequest;
|
||||
HttpReq.Credentials = CredentialCache.DefaultCredentials;
|
||||
HttpReq.Timeout = 2000;
|
||||
|
||||
@@ -382,7 +384,7 @@ namespace NewsCrawler
|
||||
HttpWebRequest HttpReq = State.m_HTTPReq;
|
||||
bool bInitial = State.m_bInitial;
|
||||
State.m_Timer.Stop();
|
||||
|
||||
string responseFromServer = "";
|
||||
try
|
||||
{
|
||||
using(HttpWebResponse response = (HttpWebResponse)HttpReq.GetResponse())
|
||||
@@ -391,11 +393,11 @@ namespace NewsCrawler
|
||||
{
|
||||
using(StreamReader reader = new StreamReader(dataStream, Encoding.GetEncoding("utf-8")))
|
||||
{
|
||||
string responseFromServer = WebUtility.HtmlDecode(reader.ReadToEnd());
|
||||
|
||||
dynamic jObj = Newtonsoft.Json.JsonConvert.DeserializeObject(responseFromServer);
|
||||
string strBody = jObj["reportBody"];
|
||||
strBody = strBody.Replace("\\\"", "\"");
|
||||
responseFromServer = WebUtility.HtmlDecode(reader.ReadToEnd());
|
||||
|
||||
dynamic jObj = Newtonsoft.Json.JsonConvert.DeserializeObject(responseFromServer);
|
||||
string strBody = jObj["reportBody"];
|
||||
strBody = strBody.Replace("\\\"", "\"");
|
||||
strBody = strBody.Replace("\r\n", "");
|
||||
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
|
||||
doc.LoadHtml(strBody);
|
||||
@@ -434,6 +436,7 @@ namespace NewsCrawler
|
||||
try
|
||||
{
|
||||
HttpWebRequest HttpReq = WebRequest.Create(strURL) as HttpWebRequest;
|
||||
HttpReq.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.3; WOW64; Trident/7.0)";
|
||||
HttpReq.Credentials = CredentialCache.DefaultCredentials;
|
||||
HttpReq.Timeout = 2000;
|
||||
|
||||
@@ -456,8 +459,8 @@ namespace NewsCrawler
|
||||
REQUEST_STATUS State = (REQUEST_STATUS)result.AsyncState;
|
||||
HttpWebRequest HttpReq = State.m_HTTPReq;
|
||||
bool bInitial = State.m_bInitial;
|
||||
State.m_Timer.Stop();
|
||||
|
||||
State.m_Timer.Stop();
|
||||
string responseFromServer = "";
|
||||
try
|
||||
{
|
||||
using (HttpWebResponse response = (HttpWebResponse)HttpReq.GetResponse())
|
||||
@@ -466,11 +469,10 @@ namespace NewsCrawler
|
||||
{
|
||||
using (StreamReader reader = new StreamReader(dataStream, Encoding.GetEncoding("utf-8")))
|
||||
{
|
||||
string responseFromServer = WebUtility.HtmlDecode(reader.ReadToEnd());
|
||||
|
||||
dynamic jObj = Newtonsoft.Json.JsonConvert.DeserializeObject(responseFromServer);
|
||||
string strBody = jObj["reportBody"];
|
||||
strBody = strBody.Replace("\\\"", "\"");
|
||||
responseFromServer = WebUtility.HtmlDecode(reader.ReadToEnd());
|
||||
dynamic jObj = Newtonsoft.Json.JsonConvert.DeserializeObject(responseFromServer);
|
||||
string strBody = jObj["reportBody"];
|
||||
strBody = strBody.Replace("\\\"", "\"");
|
||||
strBody = strBody.Replace("\r\n", "");
|
||||
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
|
||||
doc.LoadHtml(strBody);
|
||||
@@ -511,6 +513,7 @@ namespace NewsCrawler
|
||||
try
|
||||
{
|
||||
HttpWebRequest HttpReq = WebRequest.Create(strURL) as HttpWebRequest;
|
||||
HttpReq.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.3; WOW64; Trident/7.0)";
|
||||
HttpReq.Credentials = CredentialCache.DefaultCredentials;
|
||||
HttpReq.Timeout = 2000;
|
||||
|
||||
@@ -583,6 +586,7 @@ namespace NewsCrawler
|
||||
try
|
||||
{
|
||||
HttpWebRequest HttpReq = WebRequest.Create(strURL) as HttpWebRequest;
|
||||
HttpReq.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.3; WOW64; Trident/7.0)";
|
||||
HttpReq.Credentials = CredentialCache.DefaultCredentials;
|
||||
HttpReq.Timeout = 2000;
|
||||
|
||||
@@ -656,6 +660,7 @@ namespace NewsCrawler
|
||||
try
|
||||
{
|
||||
HttpWebRequest HttpReq = WebRequest.Create(strURL) as HttpWebRequest;
|
||||
HttpReq.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.3; WOW64; Trident/7.0)";
|
||||
HttpReq.Credentials = CredentialCache.DefaultCredentials;
|
||||
HttpReq.Timeout = 2000;
|
||||
|
||||
@@ -740,6 +745,7 @@ namespace NewsCrawler
|
||||
try
|
||||
{
|
||||
HttpWebRequest HttpReq = WebRequest.Create(strURL) as HttpWebRequest;
|
||||
HttpReq.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.3; WOW64; Trident/7.0)";
|
||||
HttpReq.Credentials = CredentialCache.DefaultCredentials;
|
||||
HttpReq.Timeout = 2000;
|
||||
|
||||
@@ -770,21 +776,21 @@ namespace NewsCrawler
|
||||
{
|
||||
using(Stream dataStream = response.GetResponseStream())
|
||||
{
|
||||
using(StreamReader reader = new StreamReader(dataStream, Encoding.GetEncoding("utf-8")))
|
||||
using(StreamReader reader = new StreamReader(dataStream, true))
|
||||
{
|
||||
string responseFromServer = WebUtility.HtmlDecode(reader.ReadToEnd());
|
||||
string responseFromServer = reader.ReadToEnd();
|
||||
|
||||
dynamic jObj = Newtonsoft.Json.JsonConvert.DeserializeObject(responseFromServer);
|
||||
string strErrCode = jObj["err_code"];
|
||||
if(strErrCode == "020")
|
||||
string strStatus = jObj["status"];
|
||||
if(strStatus == "020")
|
||||
{
|
||||
Config.SetDartAPIKeyLimit(State.m_strAuthKey);
|
||||
Util.Log(Util.LOG_TYPE.ERROR, string.Format("[DartAPI] {0} (key:{1}, retry:{2})", jObj["err_msg"], State.m_strAuthKey, m_iDartAPIRetry));
|
||||
Util.Log(Util.LOG_TYPE.ERROR, string.Format("[DartAPI] {0} (key:{1}, retry:{2})", jObj["message"], State.m_strAuthKey, m_iDartAPIRetry));
|
||||
return;
|
||||
}
|
||||
else if(strErrCode != "000")
|
||||
else if(strStatus != "000")
|
||||
{
|
||||
Util.Log(Util.LOG_TYPE.ERROR, string.Format("[DartAPI] {0} (key:{1}, retry:{2})", jObj["err_msg"], State.m_strAuthKey, m_iDartAPIRetry));
|
||||
Util.Log(Util.LOG_TYPE.ERROR, string.Format("[DartAPI] {0} (key:{1}, retry:{2})", jObj["message"], State.m_strAuthKey, m_iDartAPIRetry));
|
||||
m_iDartAPIRetry--;
|
||||
return;
|
||||
}
|
||||
@@ -793,10 +799,11 @@ namespace NewsCrawler
|
||||
foreach(var data in List)
|
||||
{
|
||||
string strTime = "00:00";
|
||||
string strTitle = data["rpt_nm"];
|
||||
string strCodeName = data["crp_nm"];
|
||||
string strURL = "http://m.dart.fss.or.kr/html_mdart/MD1007.html?rcpNo=" + data["rcp_no"];
|
||||
string strViewURL = "http://m.dart.fss.or.kr/viewer/main.st?rcpNo=" + data["rcp_no"];
|
||||
string strTitle = data["report_nm"];
|
||||
string strCodeName = data["corp_name"];
|
||||
string strCode = data["stock_code"];
|
||||
string strURL = "http://dart.fss.or.kr/dsaf001/main.do?rcpNo=" + data["rcept_no"];
|
||||
string strViewURL = "http://m.dart.fss.or.kr/viewer/main.st?rcpNo=" + data["rcept_no"];
|
||||
|
||||
TextCondition.RESULT MatchResult = m_Listener.CheckMatch(strTitle);
|
||||
if(MatchResult.m_enType != TextCondition.TYPE.NEGATIVE)
|
||||
@@ -841,10 +848,13 @@ namespace NewsCrawler
|
||||
try
|
||||
{
|
||||
string strAuthKey = Config.GetDartAPIKey();
|
||||
string strURL = "http://dart.fss.or.kr/api/search.json?auth="+strAuthKey+"&end_dt="+m_Today.ToString("yyyyMMdd")+"&sort=date&series=desc&page_set=100";
|
||||
string date = m_Today.ToString("yyyyMMdd");
|
||||
string strURL = $"https://opendart.fss.or.kr/api/list.json?crtfc_key={strAuthKey}&bgn_de={date}&end_de={date}&corp_cls=Y&sort=date&page_no=1&page_count=100";
|
||||
HttpWebRequest HttpReq = WebRequest.Create(strURL) as HttpWebRequest;
|
||||
HttpReq.Credentials = CredentialCache.DefaultCredentials;
|
||||
HttpReq.Timeout = 2000;
|
||||
HttpReq.Method = "GET";
|
||||
HttpReq.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.3; WOW64; Trident/7.0)";
|
||||
//HttpReq.Credentials = CredentialCache.DefaultCredentials;
|
||||
HttpReq.Timeout = 10000;
|
||||
|
||||
REQUEST_STATUS State = new REQUEST_STATUS();
|
||||
State.m_HTTPReq = HttpReq;
|
||||
@@ -953,7 +963,7 @@ namespace NewsCrawler
|
||||
{
|
||||
try
|
||||
{
|
||||
HttpWebRequest HttpReq = WebRequest.Create("http://kind.krx.co.kr/disclosure/rsstodaydistribute.do?method=searchRssTodayDistribute&repIsuSrtCd=&mktTpCd=0&searchCorpName=¤tPageSize=1000") as HttpWebRequest;
|
||||
HttpWebRequest HttpReq = WebRequest.Create("https://kind.krx.co.kr/disclosure/rsstodaydistribute.do?method=searchRssTodayDistribute&repIsuSrtCd=&mktTpCd=0&searchCorpName=¤tPageSize=1000") as HttpWebRequest;
|
||||
HttpReq.Credentials = CredentialCache.DefaultCredentials;
|
||||
HttpReq.Timeout = 2000;
|
||||
|
||||
@@ -961,6 +971,7 @@ namespace NewsCrawler
|
||||
State.m_HTTPReq = HttpReq;
|
||||
State.m_bInitial = bInitial;
|
||||
State.m_Timer.Start();
|
||||
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
|
||||
|
||||
HttpReq.BeginGetResponse(new AsyncCallback(ResponseKIND), State);
|
||||
}
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
using FluentFTP;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace NewsCrawler
|
||||
{
|
||||
class FileTransfer
|
||||
{
|
||||
const string HOST = "mjjo53.us.to";
|
||||
const string USER = "trader";
|
||||
const string PASSWORD = "sbtmaoao";
|
||||
const string REMOTE_BASE_PATH = "/";
|
||||
|
||||
public async void SendDir(string localDir, string remoteDir)
|
||||
{
|
||||
try
|
||||
{
|
||||
using (FtpClient client = new FtpClient(HOST, USER, PASSWORD))
|
||||
{
|
||||
client.ConnectTimeout = 3000;
|
||||
client.RetryAttempts = 3;
|
||||
|
||||
string project_path = Path.GetDirectoryName(Path.GetDirectoryName(System.IO.Directory.GetCurrentDirectory()));
|
||||
List<string> files = Directory.GetFiles(project_path + localDir).ToList();
|
||||
string remotePath = REMOTE_BASE_PATH + remoteDir;
|
||||
await client.ConnectAsync();
|
||||
await client.UploadFilesAsync(files, remotePath, FtpExists.Overwrite);
|
||||
//await client.ChmodAsync(remotePath, 777);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,152 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Security.Authentication;
|
||||
using System.Security.Cryptography.X509Certificates;
|
||||
using System.Text;
|
||||
|
||||
namespace FluentFTP {
|
||||
|
||||
/// <summary>
|
||||
/// Interface for the FtpClient class. For detailed documentation of the methods, please see the FtpClient class.
|
||||
/// </summary>
|
||||
public interface IFtpClient : IDisposable {
|
||||
|
||||
|
||||
// CONNECTION
|
||||
|
||||
bool IsDisposed { get; }
|
||||
FtpIpVersion InternetProtocolVersions { get; set; }
|
||||
int SocketPollInterval { get; set; }
|
||||
bool StaleDataCheck { get; set; }
|
||||
bool IsConnected { get; }
|
||||
bool EnableThreadSafeDataConnections { get; set; }
|
||||
Encoding Encoding { get; set; }
|
||||
string Host { get; set; }
|
||||
int Port { get; set; }
|
||||
NetworkCredential Credentials { get; set; }
|
||||
int MaximumDereferenceCount { get; set; }
|
||||
X509CertificateCollection ClientCertificates { get; }
|
||||
Func<string> AddressResolver { get; set; }
|
||||
IEnumerable<int> ActivePorts { get; set; }
|
||||
FtpDataConnectionType DataConnectionType { get; set; }
|
||||
bool UngracefullDisconnection { get; set; }
|
||||
int ConnectTimeout { get; set; }
|
||||
int ReadTimeout { get; set; }
|
||||
int DataConnectionConnectTimeout { get; set; }
|
||||
int DataConnectionReadTimeout { get; set; }
|
||||
bool SocketKeepAlive { get; set; }
|
||||
FtpCapability Capabilities { get; }
|
||||
FtpHashAlgorithm HashAlgorithms { get; }
|
||||
FtpEncryptionMode EncryptionMode { get; set; }
|
||||
bool DataConnectionEncryption { get; set; }
|
||||
SslProtocols SslProtocols { get; set; }
|
||||
string SystemType { get; }
|
||||
string ConnectionType { get; }
|
||||
FtpParser ListingParser { get; set; }
|
||||
CultureInfo ListingCulture { get; set; }
|
||||
double TimeOffset { get; set; }
|
||||
bool RecursiveList { get; set; }
|
||||
bool BulkListing { get; set; }
|
||||
int BulkListingLength { get; set; }
|
||||
int TransferChunkSize { get; set; }
|
||||
int RetryAttempts { get; set; }
|
||||
uint UploadRateLimit { get; set; }
|
||||
uint DownloadRateLimit { get; set; }
|
||||
FtpDataType UploadDataType { get; set; }
|
||||
FtpDataType DownloadDataType { get; set; }
|
||||
event FtpSslValidation ValidateCertificate;
|
||||
FtpReply Execute(string command);
|
||||
FtpReply GetReply();
|
||||
void Connect();
|
||||
void Disconnect();
|
||||
bool HasFeature(FtpCapability cap);
|
||||
void DisableUTF8();
|
||||
|
||||
|
||||
// MANAGEMENT
|
||||
|
||||
void DeleteFile(string path);
|
||||
void DeleteDirectory(string path);
|
||||
void DeleteDirectory(string path, FtpListOption options);
|
||||
bool DirectoryExists(string path);
|
||||
bool FileExists(string path);
|
||||
void CreateDirectory(string path);
|
||||
void CreateDirectory(string path, bool force);
|
||||
void Rename(string path, string dest);
|
||||
bool MoveFile(string path, string dest, FtpExists existsMode = FtpExists.Overwrite);
|
||||
bool MoveDirectory(string path, string dest, FtpExists existsMode = FtpExists.Overwrite);
|
||||
void SetFilePermissions(string path, int permissions);
|
||||
void Chmod(string path, int permissions);
|
||||
void SetFilePermissions(string path, FtpPermission owner, FtpPermission group, FtpPermission other);
|
||||
void Chmod(string path, FtpPermission owner, FtpPermission group, FtpPermission other);
|
||||
FtpListItem GetFilePermissions(string path);
|
||||
int GetChmod(string path);
|
||||
FtpListItem DereferenceLink(FtpListItem item);
|
||||
FtpListItem DereferenceLink(FtpListItem item, int recMax);
|
||||
void SetWorkingDirectory(string path);
|
||||
string GetWorkingDirectory();
|
||||
long GetFileSize(string path);
|
||||
DateTime GetModifiedTime(string path, FtpDate type = FtpDate.Original);
|
||||
void SetModifiedTime(string path, DateTime date, FtpDate type = FtpDate.Original);
|
||||
|
||||
|
||||
// LISTING
|
||||
|
||||
FtpListItem GetObjectInfo(string path, bool dateModified = false);
|
||||
FtpListItem[] GetListing();
|
||||
FtpListItem[] GetListing(string path);
|
||||
FtpListItem[] GetListing(string path, FtpListOption options);
|
||||
string[] GetNameListing();
|
||||
string[] GetNameListing(string path);
|
||||
|
||||
|
||||
// LOW LEVEL
|
||||
|
||||
Stream OpenRead(string path);
|
||||
Stream OpenRead(string path, FtpDataType type);
|
||||
Stream OpenRead(string path, FtpDataType type, bool checkIfFileExists);
|
||||
Stream OpenRead(string path, FtpDataType type, long restart);
|
||||
Stream OpenRead(string path, long restart);
|
||||
Stream OpenRead(string path, long restart, bool checkIfFileExists);
|
||||
Stream OpenRead(string path, FtpDataType type, long restart, bool checkIfFileExists);
|
||||
Stream OpenWrite(string path);
|
||||
Stream OpenWrite(string path, FtpDataType type);
|
||||
Stream OpenWrite(string path, FtpDataType type, bool checkIfFileExists);
|
||||
Stream OpenAppend(string path);
|
||||
Stream OpenAppend(string path, FtpDataType type);
|
||||
Stream OpenAppend(string path, FtpDataType type, bool checkIfFileExists);
|
||||
|
||||
|
||||
// HIGH LEVEL
|
||||
|
||||
int UploadFiles(IEnumerable<string> localPaths, string remoteDir, FtpExists existsMode = FtpExists.Overwrite, bool createRemoteDir = true, FtpVerify verifyOptions = FtpVerify.None, FtpError errorHandling = FtpError.None);
|
||||
int UploadFiles(IEnumerable<FileInfo> localFiles, string remoteDir, FtpExists existsMode = FtpExists.Overwrite, bool createRemoteDir = true, FtpVerify verifyOptions = FtpVerify.None, FtpError errorHandling = FtpError.None);
|
||||
int DownloadFiles(string localDir, IEnumerable<string> remotePaths, bool overwrite = true, FtpVerify verifyOptions = FtpVerify.None, FtpError errorHandling = FtpError.None);
|
||||
|
||||
bool UploadFile(string localPath, string remotePath, FtpExists existsMode = FtpExists.Overwrite, bool createRemoteDir = false, FtpVerify verifyOptions = FtpVerify.None, IProgress<double> progress = null);
|
||||
bool Upload(Stream fileStream, string remotePath, FtpExists existsMode = FtpExists.Overwrite, bool createRemoteDir = false, IProgress<double> progress = null);
|
||||
bool Upload(byte[] fileData, string remotePath, FtpExists existsMode = FtpExists.Overwrite, bool createRemoteDir = false, IProgress<double> progress = null);
|
||||
|
||||
bool DownloadFile(string localPath, string remotePath, bool overwrite = true, FtpVerify verifyOptions = FtpVerify.None, IProgress<double> progress = null);
|
||||
bool Download(Stream outStream, string remotePath, IProgress<double> progress = null);
|
||||
bool Download(out byte[] outBytes, string remotePath, IProgress<double> progress = null);
|
||||
|
||||
|
||||
// HASH
|
||||
|
||||
FtpHashAlgorithm GetHashAlgorithm();
|
||||
void SetHashAlgorithm(FtpHashAlgorithm type);
|
||||
FtpHash GetHash(string path);
|
||||
FtpHash GetChecksum(string path);
|
||||
string GetMD5(string path);
|
||||
string GetXCRC(string path);
|
||||
string GetXMD5(string path);
|
||||
string GetXSHA1(string path);
|
||||
string GetXSHA256(string path);
|
||||
string GetXSHA512(string path);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,606 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace FluentFTP {
|
||||
|
||||
/// <summary>
|
||||
/// Defines the type of encryption to use
|
||||
/// </summary>
|
||||
public enum FtpEncryptionMode {
|
||||
/// <summary>
|
||||
/// Plain text.
|
||||
/// </summary>
|
||||
None,
|
||||
/// <summary>
|
||||
/// FTPS encryption is used from the start of the connection, port 990.
|
||||
/// </summary>
|
||||
Implicit,
|
||||
/// <summary>
|
||||
/// Connection starts in plain text and FTPS encryption is enabled
|
||||
/// with the AUTH command immediately after the server greeting.
|
||||
/// </summary>
|
||||
Explicit
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The type of response the server responded with
|
||||
/// </summary>
|
||||
public enum FtpResponseType : int {
|
||||
/// <summary>
|
||||
/// No response
|
||||
/// </summary>
|
||||
None = 0,
|
||||
/// <summary>
|
||||
/// Success
|
||||
/// </summary>
|
||||
PositivePreliminary = 1,
|
||||
/// <summary>
|
||||
/// Success
|
||||
/// </summary>
|
||||
PositiveCompletion = 2,
|
||||
/// <summary>
|
||||
/// Success
|
||||
/// </summary>
|
||||
PositiveIntermediate = 3,
|
||||
/// <summary>
|
||||
/// Temporary failure
|
||||
/// </summary>
|
||||
TransientNegativeCompletion = 4,
|
||||
/// <summary>
|
||||
/// Permanent failure
|
||||
/// </summary>
|
||||
PermanentNegativeCompletion = 5
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Server features
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum FtpCapability : int {
|
||||
/// <summary>
|
||||
/// This server said it doesn't support anything!
|
||||
/// </summary>
|
||||
NONE = 0,
|
||||
/// <summary>
|
||||
/// Supports the MLST command
|
||||
/// </summary>
|
||||
MLSD = 1,
|
||||
/// <summary>
|
||||
/// Supports the SIZE command
|
||||
/// </summary>
|
||||
SIZE = 2,
|
||||
/// <summary>
|
||||
/// Supports the MDTM command
|
||||
/// </summary>
|
||||
MDTM = 4,
|
||||
/// <summary>
|
||||
/// Supports download/upload stream resumes
|
||||
/// </summary>
|
||||
REST = 8,
|
||||
/// <summary>
|
||||
/// Supports UTF8
|
||||
/// </summary>
|
||||
UTF8 = 16,
|
||||
/// <summary>
|
||||
/// PRET Command used in distributed ftp server software DrFTPD
|
||||
/// </summary>
|
||||
PRET = 32,
|
||||
/// <summary>
|
||||
/// Server supports the MFMT command for setting the
|
||||
/// modified date of an object on the server
|
||||
/// </summary>
|
||||
MFMT = 64,
|
||||
/// <summary>
|
||||
/// Server supports the MFCT command for setting the
|
||||
/// created date of an object on the server
|
||||
/// </summary>
|
||||
MFCT = 128,
|
||||
/// <summary>
|
||||
/// Server supports the MFF command for setting certain facts
|
||||
/// about file system objects. If you need this command, it would
|
||||
/// probably be handy to query FEAT your self and have a look at
|
||||
/// the FtpReply.InfoMessages property to see which facts the server
|
||||
/// allows you to modify.
|
||||
/// </summary>
|
||||
MFF = 256,
|
||||
/// <summary>
|
||||
/// Server supports the STAT command
|
||||
/// </summary>
|
||||
STAT = 512,
|
||||
/// <summary>
|
||||
/// Support for the HASH command
|
||||
/// </summary>
|
||||
HASH = 1024,
|
||||
/// <summary>
|
||||
/// Support for the non-standard MD5 command
|
||||
/// </summary>
|
||||
MD5 = 2048,
|
||||
/// <summary>
|
||||
/// Support for the non-standard XMD5 command
|
||||
/// </summary>
|
||||
XMD5 = 4096,
|
||||
/// <summary>
|
||||
/// Support for the non-standard XCRC command
|
||||
/// </summary>
|
||||
XCRC = 8192,
|
||||
/// <summary>
|
||||
/// Support for the non-standard XSHA1 command
|
||||
/// </summary>
|
||||
XSHA1 = 16384,
|
||||
/// <summary>
|
||||
/// Support for the non-standard XSHA256 command
|
||||
/// </summary>
|
||||
XSHA256 = 32768,
|
||||
/// <summary>
|
||||
/// Support for the non-standard XSHA512 command
|
||||
/// </summary>
|
||||
XSHA512 = 65536
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Different types of hashing algorithms for computing checksums.
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum FtpHashAlgorithm : int {
|
||||
/// <summary>
|
||||
/// HASH command is not supported
|
||||
/// </summary>
|
||||
NONE = 0,
|
||||
/// <summary>
|
||||
/// SHA-1
|
||||
/// </summary>
|
||||
SHA1 = 1,
|
||||
/// <summary>
|
||||
/// SHA-256
|
||||
/// </summary>
|
||||
SHA256 = 2,
|
||||
/// <summary>
|
||||
/// SHA-512
|
||||
/// </summary>
|
||||
SHA512 = 4,
|
||||
/// <summary>
|
||||
/// MD5
|
||||
/// </summary>
|
||||
MD5 = 8,
|
||||
/// <summary>
|
||||
/// CRC
|
||||
/// </summary>
|
||||
CRC = 16
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// IP Versions to allow when connecting
|
||||
/// to a server.
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum FtpIpVersion : int {
|
||||
/// <summary>
|
||||
/// Internet Protocol Version 4
|
||||
/// </summary>
|
||||
IPv4 = 1,
|
||||
/// <summary>
|
||||
/// Internet Protocol Version 6
|
||||
/// </summary>
|
||||
IPv6 = 2,
|
||||
/// <summary>
|
||||
/// Allow any supported version
|
||||
/// </summary>
|
||||
ANY = IPv4 | IPv6
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Data connection type
|
||||
/// </summary>
|
||||
public enum FtpDataConnectionType {
|
||||
/// <summary>
|
||||
/// This type of data connection attempts to use the EPSV command
|
||||
/// and if the server does not support EPSV it falls back to the
|
||||
/// PASV command before giving up unless you are connected via IPv6
|
||||
/// in which case the PASV command is not supported.
|
||||
/// </summary>
|
||||
AutoPassive,
|
||||
/// <summary>
|
||||
/// Passive data connection. EPSV is a better
|
||||
/// option if it's supported. Passive connections
|
||||
/// connect to the IP address dictated by the server
|
||||
/// which may or may not be accessible by the client
|
||||
/// for example a server behind a NAT device may
|
||||
/// give an IP address on its local network that
|
||||
/// is inaccessible to the client. Please note that IPv6
|
||||
/// does not support this type data connection. If you
|
||||
/// ask for PASV and are connected via IPv6 EPSV will
|
||||
/// automatically be used in its place.
|
||||
/// </summary>
|
||||
PASV,
|
||||
/// <summary>
|
||||
/// Same as PASV except the host supplied by the server is ignored
|
||||
/// and the data connection is made to the same address that the control
|
||||
/// connection is connected to. This is useful in scenarios where the
|
||||
/// server supplies a private/non-routable network address in the
|
||||
/// PASV response. It's functionally identical to EPSV except some
|
||||
/// servers may not implement the EPSV command. Please note that IPv6
|
||||
/// does not support this type data connection. If you
|
||||
/// ask for PASV and are connected via IPv6 EPSV will
|
||||
/// automatically be used in its place.
|
||||
/// </summary>
|
||||
PASVEX,
|
||||
/// <summary>
|
||||
/// Extended passive data connection, recommended. Works
|
||||
/// the same as a PASV connection except the server
|
||||
/// does not dictate an IP address to connect to, instead
|
||||
/// the passive connection goes to the same address used
|
||||
/// in the control connection. This type of data connection
|
||||
/// supports IPv4 and IPv6.
|
||||
/// </summary>
|
||||
EPSV,
|
||||
/// <summary>
|
||||
/// This type of data connection attempts to use the EPRT command
|
||||
/// and if the server does not support EPRT it falls back to the
|
||||
/// PORT command before giving up unless you are connected via IPv6
|
||||
/// in which case the PORT command is not supported.
|
||||
/// </summary>
|
||||
AutoActive,
|
||||
/// <summary>
|
||||
/// Active data connection, not recommended unless
|
||||
/// you have a specific reason for using this type.
|
||||
/// Creates a listening socket on the client which
|
||||
/// requires firewall exceptions on the client system
|
||||
/// as well as client network when connecting to a
|
||||
/// server outside of the client's network. In addition
|
||||
/// the IP address of the interface used to connect to the
|
||||
/// server is the address the server is told to connect to
|
||||
/// which, if behind a NAT device, may be inaccessible to
|
||||
/// the server. This type of data connection is not supported
|
||||
/// by IPv6. If you specify PORT and are connected via IPv6
|
||||
/// EPRT will automatically be used instead.
|
||||
/// </summary>
|
||||
PORT,
|
||||
/// <summary>
|
||||
/// Extended active data connection, not recommended
|
||||
/// unless you have a specific reason for using this
|
||||
/// type. Creates a listening socket on the client
|
||||
/// which requires firewall exceptions on the client
|
||||
/// as well as client network when connecting to a
|
||||
/// server outside of the client's network. The server
|
||||
/// connects to the IP address it sees the client coming
|
||||
/// from. This type of data connection supports IPv4 and IPv6.
|
||||
/// </summary>
|
||||
EPRT
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Type of data transfer to do
|
||||
/// </summary>
|
||||
public enum FtpDataType {
|
||||
/// <summary>
|
||||
/// ASCII transfer
|
||||
/// </summary>
|
||||
ASCII,
|
||||
/// <summary>
|
||||
/// Binary transfer
|
||||
/// </summary>
|
||||
Binary
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Type of file system of object
|
||||
/// </summary>
|
||||
public enum FtpFileSystemObjectType {
|
||||
/// <summary>
|
||||
/// A file
|
||||
/// </summary>
|
||||
File,
|
||||
/// <summary>
|
||||
/// A directory
|
||||
/// </summary>
|
||||
Directory,
|
||||
/// <summary>
|
||||
/// A symbolic link
|
||||
/// </summary>
|
||||
Link
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Types of file permissions
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum FtpPermission : uint {
|
||||
/// <summary>
|
||||
/// No access
|
||||
/// </summary>
|
||||
None = 0,
|
||||
/// <summary>
|
||||
/// Executable
|
||||
/// </summary>
|
||||
Execute = 1,
|
||||
/// <summary>
|
||||
/// Writable
|
||||
/// </summary>
|
||||
Write = 2,
|
||||
/// <summary>
|
||||
/// Readable
|
||||
/// </summary>
|
||||
Read = 4
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Types of special UNIX permissions
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum FtpSpecialPermissions : int {
|
||||
/// <summary>
|
||||
/// No special permissions are set
|
||||
/// </summary>
|
||||
None = 0,
|
||||
/// <summary>
|
||||
/// Sticky bit is set
|
||||
/// </summary>
|
||||
Sticky = 1,
|
||||
/// <summary>
|
||||
/// SGID bit is set
|
||||
/// </summary>
|
||||
SetGroupID = 2,
|
||||
/// <summary>
|
||||
/// SUID bit is set
|
||||
/// </summary>
|
||||
SetUserID = 4
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The type of response the server responded with
|
||||
/// </summary>
|
||||
public enum FtpParser : int {
|
||||
/// <summary>
|
||||
/// Use the legacy parser (for older projects that depend on the pre-2017 parser routines).
|
||||
/// </summary>
|
||||
Legacy = -1,
|
||||
/// <summary>
|
||||
/// Automatically detect the file listing parser to use based on the FTP server (SYST command).
|
||||
/// </summary>
|
||||
Auto = 0,
|
||||
/// <summary>
|
||||
/// Machine listing parser, works on any FTP server supporting the MLST/MLSD commands.
|
||||
/// </summary>
|
||||
Machine = 1,
|
||||
/// <summary>
|
||||
/// File listing parser for Windows/IIS.
|
||||
/// </summary>
|
||||
Windows = 2,
|
||||
/// <summary>
|
||||
/// File listing parser for Unix.
|
||||
/// </summary>
|
||||
Unix = 3,
|
||||
/// <summary>
|
||||
/// Alternate parser for Unix. Use this if the default one does not work.
|
||||
/// </summary>
|
||||
UnixAlt = 4,
|
||||
/// <summary>
|
||||
/// File listing parser for Vax/VMS/OpenVMS.
|
||||
/// </summary>
|
||||
VMS = 5,
|
||||
/// <summary>
|
||||
/// File listing parser for IBM OS400.
|
||||
/// </summary>
|
||||
IBM = 6,
|
||||
/// <summary>
|
||||
/// File listing parser for Tandem/Nonstop Guardian OS.
|
||||
/// </summary>
|
||||
NonStop = 7
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Flags that can dictate how a file listing is performed
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum FtpListOption {
|
||||
/// <summary>
|
||||
/// Tries machine listings (MDTM command) if supported,
|
||||
/// and if not then falls back to OS-specific listings (LIST command)
|
||||
/// </summary>
|
||||
Auto = 0,
|
||||
/// <summary>
|
||||
/// Load the modify date using MDTM when it could not
|
||||
/// be parsed from the server listing. This only pertains
|
||||
/// to servers that do not implement the MLSD command.
|
||||
/// </summary>
|
||||
Modify = 1,
|
||||
/// <summary>
|
||||
/// Load the file size using the SIZE command when it
|
||||
/// could not be parsed from the server listing. This
|
||||
/// only pertains to servers that do not support the
|
||||
/// MLSD command.
|
||||
/// </summary>
|
||||
Size = 2,
|
||||
/// <summary>
|
||||
/// Combines the Modify and Size flags
|
||||
/// </summary>
|
||||
SizeModify = Modify | Size,
|
||||
/// <summary>
|
||||
/// Show hidden/dot files. This only pertains to servers
|
||||
/// that do not support the MLSD command. This option
|
||||
/// makes use the non standard -a parameter to LIST to
|
||||
/// tell the server to show hidden files. Since it's a
|
||||
/// non-standard option it may not always work. MLSD listings
|
||||
/// have no such option and whether or not a hidden file is
|
||||
/// shown is at the discretion of the server.
|
||||
/// </summary>
|
||||
AllFiles = 4,
|
||||
/// <summary>
|
||||
/// Force the use of OS-specific listings (LIST command) even if
|
||||
/// machine listings (MLSD command) are supported by the server
|
||||
/// </summary>
|
||||
ForceList = 8,
|
||||
/// <summary>
|
||||
/// Use the NLST command instead of LIST for a reliable file listing
|
||||
/// </summary>
|
||||
NameList = 16,
|
||||
/// <summary>
|
||||
/// Force the use of the NLST command (the slowest mode) even if machine listings
|
||||
/// and OS-specific listings are supported by the server
|
||||
/// </summary>
|
||||
ForceNameList = ForceList | NameList,
|
||||
/// <summary>
|
||||
/// Try to dereference symbolic links, and stored the linked file/directory in FtpListItem.LinkObject
|
||||
/// </summary>
|
||||
DerefLinks = 32,
|
||||
/// <summary>
|
||||
/// Sets the ForceList flag and uses `LS' instead of `LIST' as the
|
||||
/// command for getting a directory listing. This option overrides
|
||||
/// ForceNameList and ignores the AllFiles flag.
|
||||
/// </summary>
|
||||
UseLS = 64 | ForceList,
|
||||
/// <summary>
|
||||
/// Gets files within subdirectories as well. Adds the -r option to the LIST command.
|
||||
/// Some servers may not support this feature.
|
||||
/// </summary>
|
||||
Recursive = 128,
|
||||
/// <summary>
|
||||
/// Do not retrieve path when no path is supplied to GetListing(),
|
||||
/// instead just execute LIST with no path argument.
|
||||
/// </summary>
|
||||
NoPath = 256,
|
||||
/// <summary>
|
||||
/// Include two extra items into the listing, for the current directory (".")
|
||||
/// and the parent directory (".."). Meaningless unless you want these two
|
||||
/// items for some reason.
|
||||
/// </summary>
|
||||
IncludeSelfAndParent = 512
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Defines the behavior for uploading/downloading files that already exist
|
||||
/// </summary>
|
||||
public enum FtpExists {
|
||||
/// <summary>
|
||||
/// Do not check if the file exists. A bit faster than the other options. Only use this if you are SURE that the file does not exist on the server.
|
||||
/// Otherwise it can cause the UploadFile method to hang due to filesize mismatch.
|
||||
/// </summary>
|
||||
NoCheck,
|
||||
/// <summary>
|
||||
/// Skip the file if it exists, without any more checks.
|
||||
/// </summary>
|
||||
Skip,
|
||||
/// <summary>
|
||||
/// Overwrite the file if it exists.
|
||||
/// </summary>
|
||||
Overwrite,
|
||||
/// <summary>
|
||||
/// Append to the file if it exists, by checking the length and adding the missing data.
|
||||
/// </summary>
|
||||
Append
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Defines the level of the tracing message. Depending on the framework version this is translated
|
||||
/// to an equivalent logging level in System.Diagnostices (if available)
|
||||
/// </summary>
|
||||
public enum FtpTraceLevel {
|
||||
/// <summary>
|
||||
/// Used for logging Debug or Verbose level messages
|
||||
/// </summary>
|
||||
Verbose,
|
||||
/// <summary>
|
||||
/// Used for logging Informational messages
|
||||
/// </summary>
|
||||
Info,
|
||||
/// <summary>
|
||||
/// Used for logging non-fatal or ignorable error messages
|
||||
/// </summary>
|
||||
Warn,
|
||||
/// <summary>
|
||||
/// Used for logging Error messages that may need investigation
|
||||
/// </summary>
|
||||
Error
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Defines how multi-file processes should handle a processing error.
|
||||
/// </summary>
|
||||
/// <remarks><see cref="FtpError.Stop"/> & <see cref="FtpError.Throw"/> Cannot Be Combined</remarks>
|
||||
[Flags]
|
||||
public enum FtpError {
|
||||
/// <summary>
|
||||
/// No action is taken upon errors. The method absorbs the error and continues.
|
||||
/// </summary>
|
||||
None = 0,
|
||||
/// <summary>
|
||||
/// If any files have completed successfully (or failed after a partial download/upload) then should be deleted.
|
||||
/// This will simulate an all-or-nothing transaction downloading or uploading multiple files. If this option is not
|
||||
/// combined with <see cref="FtpError.Stop"/> or <see cref="FtpError.Throw"/> then the method will
|
||||
/// continue to process all items whether if they are successful or not and then delete everything if a failure was
|
||||
/// encountered at any point.
|
||||
/// </summary>
|
||||
DeleteProcessed = 1,
|
||||
/// <summary>
|
||||
/// The method should stop processing any additional files and immediately return upon encountering an error.
|
||||
/// Cannot be combined with <see cref="FtpError.Throw"/>
|
||||
/// </summary>
|
||||
Stop = 2,
|
||||
/// <summary>
|
||||
/// The method should stop processing any additional files and immediately throw the current error.
|
||||
/// Cannot be combined with <see cref="FtpError.Stop"/>
|
||||
/// </summary>
|
||||
Throw = 4,
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Defines if additional verification and actions upon failure that
|
||||
/// should be performed when uploading/downloading files using the high-level APIs. Ignored if the
|
||||
/// FTP server does not support any hashing algorithms.
|
||||
/// </summary>
|
||||
[Flags]
|
||||
public enum FtpVerify {
|
||||
/// <summary>
|
||||
/// No verification of the file is performed
|
||||
/// </summary>
|
||||
None = 0,
|
||||
/// <summary>
|
||||
/// The checksum of the file is verified, if supported by the server.
|
||||
/// If the checksum comparison fails then we retry the download/upload
|
||||
/// a specified amount of times before giving up. (See <see cref="FtpClient.RetryAttempts"/>)
|
||||
/// </summary>
|
||||
Retry = 1,
|
||||
/// <summary>
|
||||
/// The checksum of the file is verified, if supported by the server.
|
||||
/// If the checksum comparison fails then the failed file will be deleted.
|
||||
/// If combined with <see cref="FtpVerify.Retry"/>, then
|
||||
/// the deletion will occur if it fails upon the final retry.
|
||||
/// </summary>
|
||||
Delete = 2,
|
||||
/// <summary>
|
||||
/// The checksum of the file is verified, if supported by the server.
|
||||
/// If the checksum comparison fails then an exception will be thrown.
|
||||
/// If combined with <see cref="FtpVerify.Retry"/>, then the throw will
|
||||
/// occur upon the failure of the final retry, and/or if combined with <see cref="FtpVerify.Delete"/>
|
||||
/// the method will throw after the deletion is processed.
|
||||
/// </summary>
|
||||
Throw = 4,
|
||||
/// <summary>
|
||||
/// The checksum of the file is verified, if supported by the server.
|
||||
/// If the checksum comparison fails then the method returns false and no other action is taken.
|
||||
/// </summary>
|
||||
OnlyChecksum = 8,
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Defines if additional verification and actions upon failure that
|
||||
/// should be performed when uploading/downloading files using the high-level APIs. Ignored if the
|
||||
/// FTP server does not support any hashing algorithms.
|
||||
/// </summary>
|
||||
public enum FtpDate {
|
||||
/// <summary>
|
||||
/// The date is whatever the server returns, with no conversion performed.
|
||||
/// </summary>
|
||||
Original = 0,
|
||||
#if !CORE
|
||||
/// <summary>
|
||||
/// The date is converted to the local timezone, based on the TimeOffset property in FtpClient.
|
||||
/// </summary>
|
||||
Local = 1,
|
||||
#endif
|
||||
/// <summary>
|
||||
/// The date is converted to UTC, based on the TimeOffset property in FtpClient.
|
||||
/// </summary>
|
||||
UTC = 2,
|
||||
}
|
||||
}
|
||||
@@ -1,92 +0,0 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Net.Sockets;
|
||||
using System.Net.Security;
|
||||
using System.Security.Authentication;
|
||||
using System.Security.Cryptography.X509Certificates;
|
||||
using System.Threading;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Net;
|
||||
|
||||
#if NET45
|
||||
using System.Threading.Tasks;
|
||||
#endif
|
||||
|
||||
namespace FluentFTP {
|
||||
|
||||
/// <summary>
|
||||
/// Event is fired when a SSL certificate needs to be validated
|
||||
/// </summary>
|
||||
/// <param name="control">The control connection that triggered the event</param>
|
||||
/// <param name="e">Event args</param>
|
||||
public delegate void FtpSslValidation(FtpClient control, FtpSslValidationEventArgs e);
|
||||
|
||||
/// <summary>
|
||||
/// Event fired if a bad SSL certificate is encountered. This even is used internally; if you
|
||||
/// don't have a specific reason for using it you are probably looking for FtpSslValidation.
|
||||
/// </summary>
|
||||
/// <param name="stream"></param>
|
||||
/// <param name="e"></param>
|
||||
public delegate void FtpSocketStreamSslValidation(FtpSocketStream stream, FtpSslValidationEventArgs e);
|
||||
|
||||
/// <summary>
|
||||
/// Event args for the FtpSslValidationError delegate
|
||||
/// </summary>
|
||||
public class FtpSslValidationEventArgs : EventArgs {
|
||||
X509Certificate m_certificate = null;
|
||||
/// <summary>
|
||||
/// The certificate to be validated
|
||||
/// </summary>
|
||||
public X509Certificate Certificate {
|
||||
get {
|
||||
return m_certificate;
|
||||
}
|
||||
set {
|
||||
m_certificate = value;
|
||||
}
|
||||
}
|
||||
|
||||
X509Chain m_chain = null;
|
||||
/// <summary>
|
||||
/// The certificate chain
|
||||
/// </summary>
|
||||
public X509Chain Chain {
|
||||
get {
|
||||
return m_chain;
|
||||
}
|
||||
set {
|
||||
m_chain = value;
|
||||
}
|
||||
}
|
||||
|
||||
SslPolicyErrors m_policyErrors = SslPolicyErrors.None;
|
||||
/// <summary>
|
||||
/// Validation errors, if any.
|
||||
/// </summary>
|
||||
public SslPolicyErrors PolicyErrors {
|
||||
get {
|
||||
return m_policyErrors;
|
||||
}
|
||||
set {
|
||||
m_policyErrors = value;
|
||||
}
|
||||
}
|
||||
|
||||
bool m_accept = false;
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating if this certificate should be accepted. The default
|
||||
/// value is false. If the certificate is not accepted, an AuthenticationException will
|
||||
/// be thrown.
|
||||
/// </summary>
|
||||
public bool Accept {
|
||||
get {
|
||||
return m_accept;
|
||||
}
|
||||
set {
|
||||
m_accept = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,127 +0,0 @@
|
||||
using System;
|
||||
#if !CORE
|
||||
using System.Runtime.Serialization;
|
||||
#endif
|
||||
|
||||
namespace FluentFTP {
|
||||
/// <summary>
|
||||
/// FTP related error
|
||||
/// </summary>
|
||||
#if !CORE
|
||||
[Serializable]
|
||||
#endif
|
||||
public class FtpException : Exception {
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="FtpException"/> class.
|
||||
/// </summary>
|
||||
/// <param name="message">The error message</param>
|
||||
public FtpException(string message) : base(message) { }
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="FtpException"/> class with an inner exception.
|
||||
/// </summary>
|
||||
/// <param name="message">The error message that explains the reason for the exception.</param>
|
||||
/// <param name="innerException">The exception that is the cause of the current exception, or a null reference (Nothing in Visual Basic) if no inner exception is specified.</param>
|
||||
public FtpException(string message, Exception innerException) : base(message, innerException) { }
|
||||
|
||||
#if !CORE
|
||||
/// <summary>
|
||||
/// Must be implemented so every Serializer can Deserialize the Exception
|
||||
/// </summary>
|
||||
protected FtpException(SerializationInfo info, StreamingContext context) : base(info, context) { }
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Exception triggered on command failures
|
||||
/// </summary>
|
||||
#if !CORE
|
||||
[Serializable]
|
||||
#endif
|
||||
public class FtpCommandException : FtpException {
|
||||
string _code = null;
|
||||
/// <summary>
|
||||
/// Gets the completion code associated with the response
|
||||
/// </summary>
|
||||
public string CompletionCode {
|
||||
get { return _code; }
|
||||
private set { _code = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The type of response received from the last command executed
|
||||
/// </summary>
|
||||
public FtpResponseType ResponseType {
|
||||
get {
|
||||
if (_code != null) {
|
||||
// we only care about error types, if an exception
|
||||
// is being thrown for a successful response there
|
||||
// is a problem.
|
||||
switch (_code[0]) {
|
||||
case '4':
|
||||
return FtpResponseType.TransientNegativeCompletion;
|
||||
case '5':
|
||||
return FtpResponseType.PermanentNegativeCompletion;
|
||||
}
|
||||
}
|
||||
|
||||
return FtpResponseType.None;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of a FtpResponseException
|
||||
/// </summary>
|
||||
/// <param name="code">Status code</param>
|
||||
/// <param name="message">Associated message</param>
|
||||
public FtpCommandException(string code, string message)
|
||||
: base(message) {
|
||||
CompletionCode = code;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of a FtpResponseException
|
||||
/// </summary>
|
||||
/// <param name="reply">The FtpReply to build the exception from</param>
|
||||
public FtpCommandException(FtpReply reply)
|
||||
: this(reply.Code, reply.ErrorMessage) {
|
||||
}
|
||||
|
||||
#if !CORE
|
||||
/// <summary>
|
||||
/// Must be implemented so every Serializer can Deserialize the Exception
|
||||
/// </summary>
|
||||
protected FtpCommandException(SerializationInfo info, StreamingContext context) : base(info, context) { }
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Exception is thrown when encryption could not be negotiated by the server
|
||||
/// </summary>
|
||||
#if !CORE
|
||||
[Serializable]
|
||||
#endif
|
||||
public class FtpSecurityNotAvailableException : FtpException {
|
||||
/// <summary>
|
||||
/// Default constructor
|
||||
/// </summary>
|
||||
public FtpSecurityNotAvailableException()
|
||||
: base("Security is not available on the server.") {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Custom error message
|
||||
/// </summary>
|
||||
/// <param name="message">Error message</param>
|
||||
public FtpSecurityNotAvailableException(string message)
|
||||
: base(message) {
|
||||
}
|
||||
|
||||
#if !CORE
|
||||
/// <summary>
|
||||
/// Must be implemented so every Serializer can Deserialize the Exception
|
||||
/// </summary>
|
||||
protected FtpSecurityNotAvailableException(SerializationInfo info, StreamingContext context) : base(info, context) { }
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1,137 +0,0 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Security.Cryptography;
|
||||
|
||||
namespace FluentFTP {
|
||||
/// <summary>
|
||||
/// Represents a computed hash of an object
|
||||
/// on the FTP server. See the following link
|
||||
/// for more information:
|
||||
/// http://tools.ietf.org/html/draft-bryan-ftpext-hash-02
|
||||
/// </summary>
|
||||
public class FtpHash {
|
||||
FtpHashAlgorithm m_algorithm = FtpHashAlgorithm.NONE;
|
||||
/// <summary>
|
||||
/// Gets the algorithm that was used to compute the hash
|
||||
/// </summary>
|
||||
public FtpHashAlgorithm Algorithm {
|
||||
get { return m_algorithm; }
|
||||
internal set { m_algorithm = value; }
|
||||
}
|
||||
|
||||
string m_value = null;
|
||||
/// <summary>
|
||||
/// Gets the computed hash returned by the server
|
||||
/// </summary>
|
||||
public string Value {
|
||||
get { return m_value; }
|
||||
internal set { m_value = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating if this object represents a
|
||||
/// valid hash response from the server.
|
||||
/// </summary>
|
||||
public bool IsValid {
|
||||
get { return m_algorithm != FtpHashAlgorithm.NONE && !string.IsNullOrEmpty(m_value); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Computes the hash for the specified file and compares
|
||||
/// it to the value in this object. CRC hashes are not supported
|
||||
/// because there is no built-in support in the .net framework and
|
||||
/// a CRC implementation exceeds the scope of this project. If you
|
||||
/// attempt to call this on a CRC hash a <see cref="NotImplementedException"/> will
|
||||
/// be thrown.
|
||||
/// </summary>
|
||||
/// <param name="file">The file to compute the hash for</param>
|
||||
/// <returns>True if the computed hash matches what's stored in this object.</returns>
|
||||
/// <exception cref="NotImplementedException">Thrown if called on a CRC Hash</exception>
|
||||
public bool Verify(string file) {
|
||||
using (FileStream istream = new FileStream(file, FileMode.Open, FileAccess.Read)) {
|
||||
return Verify(istream);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Computes the hash for the specified stream and compares
|
||||
/// it to the value in this object. CRC hashes are not supported
|
||||
/// because there is no built-in support in the .net framework and
|
||||
/// a CRC implementation exceeds the scope of this project. If you
|
||||
/// attempt to call this on a CRC hash a <see cref="NotImplementedException"/> will
|
||||
/// be thrown.
|
||||
/// </summary>
|
||||
/// <param name="istream">The stream to compute the hash for</param>
|
||||
/// <returns>True if the computed hash matches what's stored in this object.</returns>
|
||||
/// <exception cref="NotImplementedException">Thrown if called on a CRC Hash</exception>
|
||||
public bool Verify(Stream istream) {
|
||||
if (IsValid) {
|
||||
HashAlgorithm hashAlg = null;
|
||||
|
||||
switch (m_algorithm) {
|
||||
case FtpHashAlgorithm.SHA1:
|
||||
#if CORE
|
||||
hashAlg = SHA1.Create();
|
||||
#else
|
||||
hashAlg = new SHA1CryptoServiceProvider();
|
||||
#endif
|
||||
break;
|
||||
#if !NET20
|
||||
case FtpHashAlgorithm.SHA256:
|
||||
#if CORE
|
||||
hashAlg = SHA256.Create();
|
||||
#else
|
||||
hashAlg = new SHA256CryptoServiceProvider();
|
||||
#endif
|
||||
break;
|
||||
case FtpHashAlgorithm.SHA512:
|
||||
#if CORE
|
||||
hashAlg = SHA512.Create();
|
||||
#else
|
||||
hashAlg = new SHA512CryptoServiceProvider();
|
||||
#endif
|
||||
break;
|
||||
#endif
|
||||
case FtpHashAlgorithm.MD5:
|
||||
#if CORE
|
||||
hashAlg = MD5.Create();
|
||||
#else
|
||||
hashAlg = new MD5CryptoServiceProvider();
|
||||
#endif
|
||||
break;
|
||||
case FtpHashAlgorithm.CRC:
|
||||
throw new NotImplementedException("There is no built in support for computing CRC hashes.");
|
||||
default:
|
||||
throw new NotImplementedException("Unknown hash algorithm: " + m_algorithm.ToString());
|
||||
}
|
||||
|
||||
try {
|
||||
byte[] data = null;
|
||||
string hash = "";
|
||||
|
||||
data = hashAlg.ComputeHash(istream);
|
||||
if (data != null) {
|
||||
foreach (byte b in data) {
|
||||
hash += b.ToString("x2");
|
||||
}
|
||||
|
||||
return (hash.ToUpper() == m_value.ToUpper());
|
||||
}
|
||||
} finally {
|
||||
#if !NET20 && !NET35 // .NET 2.0 doesn't provide access to Dispose() for HashAlgorithm
|
||||
if (hashAlg != null)
|
||||
hashAlg.Dispose();
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates an empty instance.
|
||||
/// </summary>
|
||||
internal FtpHash() {
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,297 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Globalization;
|
||||
using System.Threading;
|
||||
|
||||
namespace FluentFTP {
|
||||
/// <summary>
|
||||
/// Represents a file system object on the server
|
||||
/// </summary>
|
||||
/// <example><code source="..\Examples\CustomParser.cs" lang="cs" /></example>
|
||||
public class FtpListItem {
|
||||
|
||||
/// <summary>
|
||||
/// Blank constructor; Fill args manually.
|
||||
///
|
||||
/// NOTE TO USER : You should not need to construct this class manually except in advanced cases. Typically constructed by GetListing().
|
||||
/// </summary>
|
||||
public FtpListItem() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Constructor with mandatory args filled.
|
||||
///
|
||||
/// NOTE TO USER : You should not need to construct this class manually except in advanced cases. Typically constructed by GetListing().
|
||||
/// </summary>
|
||||
public FtpListItem(string raw, string name, long size, bool isDir, ref DateTime lastModifiedTime) {
|
||||
m_input = raw;
|
||||
m_name = name;
|
||||
m_size = size;
|
||||
m_type = isDir ? FtpFileSystemObjectType.Directory : FtpFileSystemObjectType.File;
|
||||
m_modified = lastModifiedTime;
|
||||
}
|
||||
|
||||
FtpFileSystemObjectType m_type = 0;
|
||||
/// <summary>
|
||||
/// Gets the type of file system object.
|
||||
/// </summary>
|
||||
public FtpFileSystemObjectType Type {
|
||||
get {
|
||||
return m_type;
|
||||
}
|
||||
set {
|
||||
m_type = value;
|
||||
}
|
||||
}
|
||||
|
||||
string m_path = null;
|
||||
/// <summary>
|
||||
/// Gets the full path name to the object.
|
||||
/// </summary>
|
||||
public string FullName {
|
||||
get {
|
||||
return m_path;
|
||||
}
|
||||
set {
|
||||
m_path = value;
|
||||
}
|
||||
}
|
||||
|
||||
string m_name = null;
|
||||
/// <summary>
|
||||
/// Gets the name of the object.
|
||||
/// </summary>
|
||||
public string Name {
|
||||
get {
|
||||
if (m_name == null && m_path != null)
|
||||
return m_path.GetFtpFileName();
|
||||
return m_name;
|
||||
}
|
||||
set {
|
||||
m_name = value;
|
||||
}
|
||||
}
|
||||
|
||||
string m_linkTarget = null;
|
||||
/// <summary>
|
||||
/// Gets the target a symbolic link points to.
|
||||
/// </summary>
|
||||
public string LinkTarget {
|
||||
get {
|
||||
return m_linkTarget;
|
||||
}
|
||||
set {
|
||||
m_linkTarget = value;
|
||||
}
|
||||
}
|
||||
|
||||
int m_linkCount = 0;
|
||||
/// <summary>
|
||||
/// Gets the number of links pointing to this file. Only supplied by Unix servers.
|
||||
/// </summary>
|
||||
public int LinkCount {
|
||||
get {
|
||||
return m_linkCount;
|
||||
}
|
||||
set {
|
||||
m_linkCount = value;
|
||||
}
|
||||
}
|
||||
|
||||
FtpListItem m_linkObject = null;
|
||||
/// <summary>
|
||||
/// Gets the object that the LinkTarget points to. This property is null unless you pass the
|
||||
/// <see cref="FtpListOption.DerefLinks"/> flag in which case GetListing() will try to resolve
|
||||
/// the target itself.
|
||||
/// </summary>
|
||||
public FtpListItem LinkObject {
|
||||
get {
|
||||
return m_linkObject;
|
||||
}
|
||||
set {
|
||||
m_linkObject = value;
|
||||
}
|
||||
}
|
||||
|
||||
DateTime m_modified = DateTime.MinValue;
|
||||
/// <summary>
|
||||
/// Gets the last write time of the object.
|
||||
/// </summary>
|
||||
public DateTime Modified {
|
||||
get {
|
||||
return m_modified;
|
||||
}
|
||||
set {
|
||||
m_modified = value;
|
||||
}
|
||||
}
|
||||
|
||||
DateTime m_created = DateTime.MinValue;
|
||||
/// <summary>
|
||||
/// Gets the created date of the object.
|
||||
/// </summary>
|
||||
public DateTime Created {
|
||||
get {
|
||||
return m_created;
|
||||
}
|
||||
set {
|
||||
m_created = value;
|
||||
}
|
||||
}
|
||||
|
||||
long m_size = -1;
|
||||
/// <summary>
|
||||
/// Gets the size of the object.
|
||||
/// </summary>
|
||||
public long Size {
|
||||
get {
|
||||
return m_size;
|
||||
}
|
||||
set {
|
||||
m_size = value;
|
||||
}
|
||||
}
|
||||
|
||||
FtpSpecialPermissions m_specialPermissions = FtpSpecialPermissions.None;
|
||||
/// <summary>
|
||||
/// Gets special UNIX permissions such as Sticky, SUID and SGID.
|
||||
/// </summary>
|
||||
public FtpSpecialPermissions SpecialPermissions {
|
||||
get {
|
||||
return m_specialPermissions;
|
||||
}
|
||||
set {
|
||||
m_specialPermissions = value;
|
||||
}
|
||||
}
|
||||
|
||||
FtpPermission m_ownerPermissions = FtpPermission.None;
|
||||
/// <summary>
|
||||
/// Gets the owner permissions.
|
||||
/// </summary>
|
||||
public FtpPermission OwnerPermissions {
|
||||
get {
|
||||
return m_ownerPermissions;
|
||||
}
|
||||
set {
|
||||
m_ownerPermissions = value;
|
||||
}
|
||||
}
|
||||
|
||||
FtpPermission m_groupPermissions = FtpPermission.None;
|
||||
/// <summary>
|
||||
/// Gets the group permissions.
|
||||
/// </summary>
|
||||
public FtpPermission GroupPermissions {
|
||||
get {
|
||||
return m_groupPermissions;
|
||||
}
|
||||
set {
|
||||
m_groupPermissions = value;
|
||||
}
|
||||
}
|
||||
|
||||
FtpPermission m_otherPermissions = FtpPermission.None;
|
||||
/// <summary>
|
||||
/// Gets the others permissions.
|
||||
/// </summary>
|
||||
public FtpPermission OthersPermissions {
|
||||
get {
|
||||
return m_otherPermissions;
|
||||
}
|
||||
set {
|
||||
m_otherPermissions = value;
|
||||
}
|
||||
}
|
||||
|
||||
string m_rawPermissions = null;
|
||||
/// <summary>
|
||||
/// Gets the raw string received for the file permissions.
|
||||
/// Use this if the other properties are blank/invalid.
|
||||
/// </summary>
|
||||
public string RawPermissions {
|
||||
get {
|
||||
return m_rawPermissions;
|
||||
}
|
||||
set {
|
||||
m_rawPermissions = value;
|
||||
}
|
||||
}
|
||||
|
||||
int m_chmod = 0;
|
||||
/// <summary>
|
||||
/// Gets the file permissions in the CHMOD format.
|
||||
/// </summary>
|
||||
public int Chmod {
|
||||
get {
|
||||
return m_chmod;
|
||||
}
|
||||
set {
|
||||
m_chmod = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the raw string received for the file's GROUP permissions.
|
||||
/// Use this if the other properties are blank/invalid.
|
||||
/// </summary>
|
||||
public string RawGroup = null;
|
||||
/// <summary>
|
||||
/// Gets the raw string received for the file's OWNER permissions.
|
||||
/// Use this if the other properties are blank/invalid.
|
||||
/// </summary>
|
||||
public string RawOwner = null;
|
||||
|
||||
|
||||
string m_input = null;
|
||||
/// <summary>
|
||||
/// Gets the input string that was parsed to generate the
|
||||
/// values in this object.
|
||||
/// </summary>
|
||||
public string Input {
|
||||
get {
|
||||
return m_input;
|
||||
}
|
||||
set {
|
||||
m_input = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a string representation of this object and its properties
|
||||
/// </summary>
|
||||
/// <returns>A string representing this object</returns>
|
||||
public override string ToString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (Type == FtpFileSystemObjectType.File) {
|
||||
sb.Append("FILE");
|
||||
} else if (Type == FtpFileSystemObjectType.Directory) {
|
||||
sb.Append("DIR ");
|
||||
} else if (Type == FtpFileSystemObjectType.Link) {
|
||||
sb.Append("LINK");
|
||||
}
|
||||
sb.Append(" ");
|
||||
sb.Append(Name);
|
||||
if (Type == FtpFileSystemObjectType.File) {
|
||||
sb.Append(" ");
|
||||
sb.Append("(");
|
||||
sb.Append(Size.FileSizeToString());
|
||||
sb.Append(")");
|
||||
}
|
||||
if (Created != DateTime.MinValue) {
|
||||
sb.Append(" ");
|
||||
sb.Append("Created : ");
|
||||
sb.Append(Created.ToString());
|
||||
}
|
||||
if (Modified != DateTime.MinValue) {
|
||||
sb.Append(" ");
|
||||
sb.Append("Modified : ");
|
||||
sb.Append(Modified.ToString());
|
||||
}
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,113 +0,0 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace FluentFTP {
|
||||
/// <summary>
|
||||
/// Represents a reply to an event on the server
|
||||
/// </summary>
|
||||
public struct FtpReply {
|
||||
/// <summary>
|
||||
/// The type of response received from the last command executed
|
||||
/// </summary>
|
||||
public FtpResponseType Type {
|
||||
get {
|
||||
int code;
|
||||
|
||||
if (Code != null && Code.Length > 0 &&
|
||||
int.TryParse(Code[0].ToString(), out code)) {
|
||||
return (FtpResponseType)code;
|
||||
}
|
||||
|
||||
return FtpResponseType.None;
|
||||
}
|
||||
}
|
||||
|
||||
string m_respCode;
|
||||
/// <summary>
|
||||
/// The status code of the response
|
||||
/// </summary>
|
||||
public string Code {
|
||||
get {
|
||||
return m_respCode;
|
||||
}
|
||||
set {
|
||||
m_respCode = value;
|
||||
}
|
||||
}
|
||||
|
||||
string m_respMessage;
|
||||
/// <summary>
|
||||
/// The message, if any, that the server sent with the response
|
||||
/// </summary>
|
||||
public string Message {
|
||||
get {
|
||||
return m_respMessage;
|
||||
}
|
||||
set {
|
||||
m_respMessage = value;
|
||||
}
|
||||
}
|
||||
|
||||
string m_infoMessages;
|
||||
/// <summary>
|
||||
/// Informational messages sent from the server
|
||||
/// </summary>
|
||||
public string InfoMessages {
|
||||
get {
|
||||
return m_infoMessages;
|
||||
}
|
||||
set {
|
||||
m_infoMessages = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// General success or failure of the last command executed
|
||||
/// </summary>
|
||||
public bool Success {
|
||||
get {
|
||||
if (Code != null && Code.Length > 0) {
|
||||
int i;
|
||||
|
||||
// 1xx, 2xx, 3xx indicate success
|
||||
// 4xx, 5xx are failures
|
||||
if (int.TryParse(Code[0].ToString(), out i) && i >= 1 && i <= 3) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the error message including any informational output
|
||||
/// that was sent by the server. Sometimes the final response
|
||||
/// line doesn't contain anything informative as to what was going
|
||||
/// on with the server. Instead it may send information messages so
|
||||
/// in an effort to give as meaningful as a response as possible
|
||||
/// the informational messages will be included in the error.
|
||||
/// </summary>
|
||||
public string ErrorMessage {
|
||||
get {
|
||||
string message = "";
|
||||
|
||||
if (Success) {
|
||||
return message;
|
||||
}
|
||||
|
||||
if (InfoMessages != null && InfoMessages.Length > 0) {
|
||||
foreach (string s in InfoMessages.Split('\n')) {
|
||||
string m = Regex.Replace(s, "^[0-9]{3}-", "");
|
||||
message += (m.Trim() + "; ");
|
||||
}
|
||||
}
|
||||
|
||||
message += Message;
|
||||
|
||||
return message;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,275 +0,0 @@
|
||||
#define TRACE
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
|
||||
namespace FluentFTP {
|
||||
/// <summary>
|
||||
/// Used for transaction logging and debug information.
|
||||
/// </summary>
|
||||
public static class FtpTrace {
|
||||
|
||||
#if !CORE
|
||||
private static volatile TraceSource m_traceSource = new TraceSource("FluentFTP") {
|
||||
Switch = new SourceSwitch("sourceSwitch", "Verbose") { Level = SourceLevels.All }
|
||||
};
|
||||
|
||||
static bool m_flushOnWrite = true;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Should the trace listeners be flushed immediately after writing to them?
|
||||
/// </summary>
|
||||
public static bool FlushOnWrite {
|
||||
get { return m_flushOnWrite; }
|
||||
set { m_flushOnWrite = value; }
|
||||
}
|
||||
|
||||
static bool m_prefix = false;
|
||||
|
||||
/// <summary>
|
||||
/// Should the log entries be written with a prefix of "FluentFTP"?
|
||||
/// Useful if you have a single TraceListener shared across multiple libraries.
|
||||
/// </summary>
|
||||
public static bool LogPrefix {
|
||||
get { return m_prefix; }
|
||||
set { m_prefix = value; }
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Add a TraceListner to the collection. You can use one of the predefined
|
||||
/// TraceListeners in the System.Diagnostics namespace, such as ConsoleTraceListener
|
||||
/// for logging to the console, or you can write your own deriving from
|
||||
/// System.Diagnostics.TraceListener.
|
||||
/// </summary>
|
||||
/// <param name="listener">The TraceListener to add to the collection</param>
|
||||
public static void AddListener(TraceListener listener) {
|
||||
lock (m_traceSource) {
|
||||
m_traceSource.Listeners.Add(listener);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Remove the specified TraceListener from the collection
|
||||
/// </summary>
|
||||
/// <param name="listener">The TraceListener to remove from the collection.</param>
|
||||
public static void RemoveListener(TraceListener listener) {
|
||||
lock (m_traceSource) {
|
||||
m_traceSource.Listeners.Remove(listener);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if CORE
|
||||
|
||||
static bool m_LogToConsole = false;
|
||||
|
||||
/// <summary>
|
||||
/// Should FTP communication be be logged to console?
|
||||
/// </summary>
|
||||
public static bool LogToConsole {
|
||||
get { return m_LogToConsole; }
|
||||
set { m_LogToConsole = value; }
|
||||
}
|
||||
|
||||
static string m_LogToFile = null;
|
||||
|
||||
/// <summary>
|
||||
/// Set this to a file path to append all FTP communication to it.
|
||||
/// </summary>
|
||||
public static string LogToFile {
|
||||
get { return m_LogToFile; }
|
||||
set { m_LogToFile = value; }
|
||||
}
|
||||
|
||||
#endif
|
||||
static bool m_functions = true;
|
||||
|
||||
/// <summary>
|
||||
/// Should the function calls be logged in Verbose mode?
|
||||
/// </summary>
|
||||
public static bool LogFunctions {
|
||||
get { return m_functions; }
|
||||
set { m_functions = value; }
|
||||
}
|
||||
|
||||
static bool m_IP = true;
|
||||
|
||||
/// <summary>
|
||||
/// Should the FTP server IP addresses be included in the logs?
|
||||
/// </summary>
|
||||
public static bool LogIP {
|
||||
get { return m_IP; }
|
||||
set { m_IP = value; }
|
||||
}
|
||||
|
||||
static bool m_username = true;
|
||||
|
||||
/// <summary>
|
||||
/// Should the FTP usernames be included in the logs?
|
||||
/// </summary>
|
||||
public static bool LogUserName {
|
||||
get { return m_username; }
|
||||
set { m_username = value; }
|
||||
}
|
||||
|
||||
static bool m_password = false;
|
||||
|
||||
/// <summary>
|
||||
/// Should the FTP passwords be included in the logs?
|
||||
/// </summary>
|
||||
public static bool LogPassword {
|
||||
get { return m_password; }
|
||||
set { m_password = value; }
|
||||
}
|
||||
|
||||
static bool m_tracing = true;
|
||||
|
||||
/// <summary>
|
||||
/// Should we trace at all?
|
||||
/// </summary>
|
||||
public static bool EnableTracing
|
||||
{
|
||||
get { return m_tracing; }
|
||||
set { m_tracing = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Write to the TraceListeners
|
||||
/// </summary>
|
||||
/// <param name="message">The message to write</param>
|
||||
//[Obsolete("Use overloads with FtpTraceLevel")]
|
||||
public static void Write(string message) {
|
||||
Write(FtpTraceLevel.Verbose, message);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Write to the TraceListeners
|
||||
/// </summary>
|
||||
/// <param name="message">The message to write</param>
|
||||
//[Obsolete("Use overloads with FtpTraceLevel")]
|
||||
public static void WriteLine(object message) {
|
||||
Write(FtpTraceLevel.Verbose, message.ToString());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Write to the TraceListeners
|
||||
/// </summary>
|
||||
/// <param name="eventType">The type of tracing event</param>
|
||||
/// <param name="message">The message to write</param>
|
||||
public static void WriteLine(FtpTraceLevel eventType, object message) {
|
||||
Write(eventType, message.ToString());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Write to the TraceListeners, adding an automatic prefix to the message based on the `eventType`
|
||||
/// </summary>
|
||||
/// <param name="eventType">The type of tracing event</param>
|
||||
/// <param name="message">The message to write</param>
|
||||
public static void WriteStatus(FtpTraceLevel eventType, object message) {
|
||||
Write(eventType, TraceLevelPrefix(eventType) + message.ToString());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Write to the TraceListeners, for the purpose of logging a API function call
|
||||
/// </summary>
|
||||
/// <param name="function">The name of the API function</param>
|
||||
/// <param name="args">The args passed to the function</param>
|
||||
public static void WriteFunc(string function, object[] args = null) {
|
||||
if (m_functions) {
|
||||
Write(FtpTraceLevel.Verbose, "");
|
||||
Write(FtpTraceLevel.Verbose, "# " + function + "(" + args.ItemsToString().Join(", ") + ")");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Write to the TraceListeners
|
||||
/// </summary>
|
||||
/// <param name="eventType">The type of tracing event</param>
|
||||
/// <param name="message">A formattable string to write</param>
|
||||
public static void Write(FtpTraceLevel eventType, string message) {
|
||||
if(!EnableTracing)
|
||||
return;
|
||||
#if CORE
|
||||
#if DEBUG
|
||||
Debug.WriteLine(message);
|
||||
#else
|
||||
if (m_LogToConsole) {
|
||||
Console.WriteLine(message);
|
||||
}
|
||||
if (m_LogToFile != null) {
|
||||
File.AppendAllText(m_LogToFile, message + "\n");
|
||||
}
|
||||
#endif
|
||||
#elif !CORE
|
||||
|
||||
if (m_prefix) {
|
||||
|
||||
// if prefix is wanted then use TraceEvent()
|
||||
m_traceSource.TraceEvent(TraceLevelTranslation(eventType), 0, message);
|
||||
|
||||
} else {
|
||||
|
||||
// if prefix is NOT wanted then write manually
|
||||
EmitEvent(m_traceSource, TraceLevelTranslation(eventType), message);
|
||||
|
||||
}
|
||||
if (m_flushOnWrite) {
|
||||
m_traceSource.Flush();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
private static string TraceLevelPrefix(FtpTraceLevel level) {
|
||||
switch (level) {
|
||||
case FtpTraceLevel.Verbose:
|
||||
return "Status: ";
|
||||
case FtpTraceLevel.Info:
|
||||
return "Status: ";
|
||||
case FtpTraceLevel.Warn:
|
||||
return "Warning: ";
|
||||
case FtpTraceLevel.Error:
|
||||
return "Error: ";
|
||||
}
|
||||
return "Status: ";
|
||||
}
|
||||
|
||||
#if !CORE
|
||||
|
||||
private static TraceEventType TraceLevelTranslation(FtpTraceLevel level) {
|
||||
switch (level) {
|
||||
case FtpTraceLevel.Verbose:
|
||||
return TraceEventType.Verbose;
|
||||
case FtpTraceLevel.Info:
|
||||
return TraceEventType.Information;
|
||||
case FtpTraceLevel.Warn:
|
||||
return TraceEventType.Warning;
|
||||
case FtpTraceLevel.Error:
|
||||
return TraceEventType.Error;
|
||||
default:
|
||||
return TraceEventType.Verbose;
|
||||
}
|
||||
}
|
||||
|
||||
static object traceSync = new object();
|
||||
private static void EmitEvent(TraceSource traceSource, TraceEventType eventType, string message) {
|
||||
try {
|
||||
lock (traceSync) {
|
||||
if (traceSource.Switch.ShouldTrace(eventType)) {
|
||||
foreach (TraceListener listener in traceSource.Listeners) {
|
||||
try {
|
||||
listener.WriteLine(message);
|
||||
listener.Flush();
|
||||
} catch { }
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace FluentFTP
|
||||
{
|
||||
internal class IntRef
|
||||
{
|
||||
public int Value;
|
||||
}
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace FluentFTP.Proxy {
|
||||
/// <summary> A FTP client with a HTTP 1.1 proxy implementation. </summary>
|
||||
public class FtpClientHttp11Proxy : FtpClientProxy {
|
||||
/// <summary> A FTP client with a HTTP 1.1 proxy implementation </summary>
|
||||
/// <param name="proxy">Proxy information</param>
|
||||
public FtpClientHttp11Proxy(ProxyInfo proxy)
|
||||
: base(proxy) {
|
||||
ConnectionType = "HTTP 1.1 Proxy";
|
||||
}
|
||||
|
||||
/// <summary> Redefine the first dialog: HTTP Frame for the HTTP 1.1 Proxy </summary>
|
||||
protected override void Handshake() {
|
||||
var proxyConnectionReply = GetReply();
|
||||
if (!proxyConnectionReply.Success)
|
||||
throw new FtpException("Can't connect " + Host + " via proxy " + Proxy.Host + ".\nMessage : " +
|
||||
proxyConnectionReply.ErrorMessage);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of this class. Useful in FTP proxy classes.
|
||||
/// </summary>
|
||||
protected override FtpClient Create() {
|
||||
return new FtpClientHttp11Proxy(Proxy);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Connects to the server using an existing <see cref="FtpSocketStream"/>
|
||||
/// </summary>
|
||||
/// <param name="stream">The existing socket stream</param>
|
||||
protected override void Connect(FtpSocketStream stream) {
|
||||
Connect(stream, Host, Port, FtpIpVersion.ANY);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Connects to the server using an existing <see cref="FtpSocketStream"/>
|
||||
/// </summary>
|
||||
/// <param name="stream">The existing socket stream</param>
|
||||
/// <param name="host">Host name</param>
|
||||
/// <param name="port">Port number</param>
|
||||
/// <param name="ipVersions">IP version to use</param>
|
||||
protected override void Connect(FtpSocketStream stream, string host, int port, FtpIpVersion ipVersions) {
|
||||
base.Connect(stream);
|
||||
|
||||
var writer = new StreamWriter(stream);
|
||||
writer.WriteLine("CONNECT {0}:{1} HTTP/1.1", host, port);
|
||||
writer.WriteLine("Host: {0}:{1}", host, port);
|
||||
if (Proxy.Credentials != null) {
|
||||
var credentialsHash = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(Proxy.Credentials.UserName + ":"+ Proxy.Credentials.Password));
|
||||
writer.WriteLine("Proxy-Authorization: Basic "+ credentialsHash);
|
||||
}
|
||||
writer.WriteLine("User-Agent: custom-ftp-client");
|
||||
writer.WriteLine();
|
||||
writer.Flush();
|
||||
|
||||
ProxyHandshake(stream);
|
||||
}
|
||||
|
||||
private void ProxyHandshake(FtpSocketStream stream) {
|
||||
var proxyConnectionReply = GetProxyReply(stream);
|
||||
if (!proxyConnectionReply.Success)
|
||||
throw new FtpException("Can't connect " + Host + " via proxy " + Proxy.Host + ".\nMessage : " + proxyConnectionReply.ErrorMessage);
|
||||
}
|
||||
|
||||
private FtpReply GetProxyReply( FtpSocketStream stream ) {
|
||||
|
||||
FtpReply reply = new FtpReply();
|
||||
string buf;
|
||||
|
||||
#if !CORE14
|
||||
lock ( Lock ) {
|
||||
#endif
|
||||
if( !IsConnected )
|
||||
throw new InvalidOperationException( "No connection to the server has been established." );
|
||||
|
||||
stream.ReadTimeout = ReadTimeout;
|
||||
while( ( buf = stream.ReadLine( Encoding ) ) != null ) {
|
||||
Match m;
|
||||
|
||||
FtpTrace.WriteLine(FtpTraceLevel.Info, buf);
|
||||
|
||||
if( ( m = Regex.Match( buf, @"^HTTP/.*\s(?<code>[0-9]{3}) (?<message>.*)$" ) ).Success ) {
|
||||
reply.Code = m.Groups[ "code" ].Value;
|
||||
reply.Message = m.Groups[ "message" ].Value;
|
||||
break;
|
||||
}
|
||||
|
||||
reply.InfoMessages += ( buf+"\n" );
|
||||
}
|
||||
|
||||
// fixes #84 (missing bytes when downloading/uploading files through proxy)
|
||||
while( ( buf = stream.ReadLine( Encoding ) ) != null ) {
|
||||
|
||||
FtpTrace.WriteLine(FtpTraceLevel.Info, buf);
|
||||
|
||||
if (FtpExtensions.IsNullOrWhiteSpace(buf)) {
|
||||
break;
|
||||
}
|
||||
|
||||
reply.InfoMessages += ( buf+"\n" );
|
||||
}
|
||||
|
||||
#if !CORE14
|
||||
}
|
||||
#endif
|
||||
|
||||
return reply;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
namespace FluentFTP.Proxy {
|
||||
/// <summary>
|
||||
/// Abstraction of an FtpClient with a proxy
|
||||
/// </summary>
|
||||
public abstract class FtpClientProxy : FtpClient {
|
||||
private ProxyInfo _proxy;
|
||||
/// <summary> The proxy connection info. </summary>
|
||||
protected ProxyInfo Proxy { get { return _proxy; } }
|
||||
|
||||
/// <summary> A FTP client with a HTTP 1.1 proxy implementation </summary>
|
||||
/// <param name="proxy">Proxy information</param>
|
||||
protected FtpClientProxy(ProxyInfo proxy) {
|
||||
_proxy = proxy;
|
||||
}
|
||||
|
||||
/// <summary> Redefine connect for FtpClient : authentication on the Proxy </summary>
|
||||
/// <param name="stream">The socket stream.</param>
|
||||
protected override void Connect(FtpSocketStream stream) {
|
||||
stream.Connect(Proxy.Host, Proxy.Port, InternetProtocolVersions);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
namespace FluentFTP.Proxy {
|
||||
/// <summary> A FTP client with a user@host proxy identification. </summary>
|
||||
public class FtpClientUserAtHostProxy : FtpClientProxy {
|
||||
/// <summary> A FTP client with a user@host proxy identification. </summary>
|
||||
/// <param name="proxy">Proxy information</param>
|
||||
public FtpClientUserAtHostProxy(ProxyInfo proxy)
|
||||
: base(proxy) {
|
||||
ConnectionType = "User@Host";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of this class. Useful in FTP proxy classes.
|
||||
/// </summary>
|
||||
protected override FtpClient Create() {
|
||||
return new FtpClientUserAtHostProxy(Proxy);
|
||||
}
|
||||
|
||||
/// <summary> Redefine the first dialog: auth with proxy information </summary>
|
||||
protected override void Handshake() {
|
||||
// Proxy authentication eventually needed.
|
||||
if (Proxy.Credentials != null)
|
||||
Authenticate(Proxy.Credentials.UserName, Proxy.Credentials.Password);
|
||||
|
||||
// Connection USER@Host means to change user name to add host.
|
||||
Credentials.UserName = Credentials.UserName + "@" + Host;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
namespace FluentFTP.Proxy {
|
||||
/// <summary>
|
||||
/// A FTP client with a user@host proxy identification, that works with Blue Coat FTP Service servers.
|
||||
///
|
||||
/// The 'blue coat variant' forces the client to wait for a 220 FTP response code in
|
||||
/// the handshake phase.
|
||||
/// </summary>
|
||||
public class FtpClientUserAtHostProxyBlueCoat : FtpClientProxy
|
||||
{
|
||||
/// <summary> A FTP client with a user@host proxy identification. </summary>
|
||||
/// <param name="proxy">Proxy information</param>
|
||||
public FtpClientUserAtHostProxyBlueCoat(ProxyInfo proxy)
|
||||
: base(proxy)
|
||||
{
|
||||
ConnectionType = "User@Host";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of this class. Useful in FTP proxy classes.
|
||||
/// </summary>
|
||||
protected override FtpClient Create()
|
||||
{
|
||||
return new FtpClientUserAtHostProxyBlueCoat(Proxy);
|
||||
}
|
||||
|
||||
/// <summary> Redefine the first dialog: auth with proxy information </summary>
|
||||
protected override void Handshake()
|
||||
{
|
||||
// Proxy authentication eventually needed.
|
||||
if (Proxy.Credentials != null)
|
||||
Authenticate(Proxy.Credentials.UserName, Proxy.Credentials.Password);
|
||||
|
||||
// Connection USER@Host means to change user name to add host.
|
||||
Credentials.UserName = Credentials.UserName + "@" + Host;
|
||||
|
||||
FtpReply reply = GetReply();
|
||||
if (reply.Code == "220")
|
||||
FtpTrace.WriteLine(FtpTraceLevel.Info, "Status: Server is ready for the new client");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
using System.Net;
|
||||
|
||||
namespace FluentFTP.Proxy {
|
||||
/// <summary> POCO holding proxy information</summary>
|
||||
public class ProxyInfo {
|
||||
/// <summary> Proxy host name </summary>
|
||||
public string Host { get; set; }
|
||||
|
||||
/// <summary> Proxy port </summary>
|
||||
public int Port { get; set; }
|
||||
|
||||
/// <summary> Proxy login credentials </summary>
|
||||
public NetworkCredential Credentials { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,189 +0,0 @@
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Diagnostics;
|
||||
using System.Threading;
|
||||
|
||||
#if ASYNC
|
||||
using System.Threading.Tasks;
|
||||
#endif
|
||||
|
||||
namespace FluentFTP {
|
||||
|
||||
/// <summary>
|
||||
/// Base class for data stream connections
|
||||
/// </summary>
|
||||
public class FtpDataStream : FtpSocketStream {
|
||||
FtpReply m_commandStatus;
|
||||
/// <summary>
|
||||
/// Gets the status of the command that was used to open
|
||||
/// this data channel
|
||||
/// </summary>
|
||||
public FtpReply CommandStatus {
|
||||
get {
|
||||
return m_commandStatus;
|
||||
}
|
||||
set {
|
||||
m_commandStatus = value;
|
||||
}
|
||||
}
|
||||
|
||||
FtpClient m_control = null;
|
||||
/// <summary>
|
||||
/// Gets or sets the control connection for this data stream. Setting
|
||||
/// the control connection causes the object to be cloned and a new
|
||||
/// connection is made to the server to carry out the task. This ensures
|
||||
/// that multiple streams can be opened simultaneously.
|
||||
/// </summary>
|
||||
public FtpClient ControlConnection {
|
||||
get {
|
||||
return m_control;
|
||||
}
|
||||
set {
|
||||
m_control = value;
|
||||
}
|
||||
}
|
||||
|
||||
long m_length = 0;
|
||||
/// <summary>
|
||||
/// Gets or sets the length of the stream. Only valid for file transfers
|
||||
/// and only valid on servers that support the Size command.
|
||||
/// </summary>
|
||||
public override long Length {
|
||||
get {
|
||||
return m_length;
|
||||
}
|
||||
}
|
||||
|
||||
long m_position = 0;
|
||||
/// <summary>
|
||||
/// Gets or sets the position of the stream
|
||||
/// </summary>
|
||||
public override long Position {
|
||||
get {
|
||||
return m_position;
|
||||
}
|
||||
set {
|
||||
throw new InvalidOperationException("You cannot modify the position of a FtpDataStream. This property is updated as data is read or written to the stream.");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Reads data off the stream
|
||||
/// </summary>
|
||||
/// <param name="buffer">The buffer to read into</param>
|
||||
/// <param name="offset">Where to start in the buffer</param>
|
||||
/// <param name="count">Number of bytes to read</param>
|
||||
/// <returns>The number of bytes read</returns>
|
||||
public override int Read(byte[] buffer, int offset, int count) {
|
||||
int read = base.Read(buffer, offset, count);
|
||||
m_position += read;
|
||||
return read;
|
||||
}
|
||||
|
||||
#if ASYNC
|
||||
/// <summary>
|
||||
/// Reads data off the stream asynchronously
|
||||
/// </summary>
|
||||
/// <param name="buffer">The buffer to read into</param>
|
||||
/// <param name="offset">Where to start in the buffer</param>
|
||||
/// <param name="count">Number of bytes to read</param>
|
||||
/// <param name="token">The cancellation token for this task</param>
|
||||
/// <returns>The number of bytes read</returns>
|
||||
public override async Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken token) {
|
||||
int read = await base.ReadAsync(buffer, offset, count, token);
|
||||
m_position += read;
|
||||
return read;
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Writes data to the stream
|
||||
/// </summary>
|
||||
/// <param name="buffer">The buffer to write to the stream</param>
|
||||
/// <param name="offset">Where to start in the buffer</param>
|
||||
/// <param name="count">The number of bytes to write to the buffer</param>
|
||||
public override void Write(byte[] buffer, int offset, int count) {
|
||||
base.Write(buffer, offset, count);
|
||||
m_position += count;
|
||||
}
|
||||
|
||||
#if ASYNC
|
||||
/// <summary>
|
||||
/// Writes data to the stream asynchronously
|
||||
/// </summary>
|
||||
/// <param name="buffer">The buffer to write to the stream</param>
|
||||
/// <param name="offset">Where to start in the buffer</param>
|
||||
/// <param name="count">The number of bytes to write to the buffer</param>
|
||||
/// <param name="token">The <see cref="CancellationToken"/> for this task</param>
|
||||
public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken token) {
|
||||
await base.WriteAsync(buffer, offset, count, token);
|
||||
m_position += count;
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Sets the length of this stream
|
||||
/// </summary>
|
||||
/// <param name="value">Value to apply to the Length property</param>
|
||||
public override void SetLength(long value) {
|
||||
m_length = value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the position of the stream. Intended to be used
|
||||
/// internally by FtpControlConnection.
|
||||
/// </summary>
|
||||
/// <param name="pos">The position</param>
|
||||
public void SetPosition(long pos) {
|
||||
m_position = pos;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Closes the connection and reads the server's reply
|
||||
/// </summary>
|
||||
public new FtpReply Close() {
|
||||
base.Close();
|
||||
|
||||
try {
|
||||
if (ControlConnection != null)
|
||||
return ControlConnection.CloseDataStream(this);
|
||||
} finally {
|
||||
m_commandStatus = new FtpReply();
|
||||
m_control = null;
|
||||
}
|
||||
|
||||
return new FtpReply();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new data stream object
|
||||
/// </summary>
|
||||
/// <param name="conn">The control connection to be used for carrying out this operation</param>
|
||||
public FtpDataStream(FtpClient conn) : base(conn.SslProtocols) {
|
||||
if (conn == null)
|
||||
throw new ArgumentException("The control connection cannot be null.");
|
||||
|
||||
ControlConnection = conn;
|
||||
// always accept certificate no matter what because if code execution ever
|
||||
// gets here it means the certificate on the control connection object being
|
||||
// cloned was already accepted.
|
||||
ValidateCertificate += new FtpSocketStreamSslValidation(delegate (FtpSocketStream obj, FtpSslValidationEventArgs e) {
|
||||
e.Accept = true;
|
||||
});
|
||||
|
||||
m_position = 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Finalizer
|
||||
/// </summary>
|
||||
~FtpDataStream() {
|
||||
try {
|
||||
Dispose(false);
|
||||
} catch (Exception ex) {
|
||||
FtpTrace.WriteLine(FtpTraceLevel.Warn, "[Finalizer] Caught and discarded an exception while disposing the FtpDataStream: " + ex.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,284 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
#if !CORE
|
||||
using System.Linq;
|
||||
using System.Net.Security;
|
||||
using System.Runtime.ConstrainedExecution;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
#endif
|
||||
|
||||
namespace FluentFTP {
|
||||
|
||||
#if !CORE
|
||||
/// <summary>
|
||||
/// .NET SslStream doesn't close TLS connection properly.
|
||||
/// It does not send the close_notify alert before closing the connection.
|
||||
/// FtpSslStream uses unsafe code to do that.
|
||||
/// This is required when we want to downgrade the connection to plaintext using CCC command.
|
||||
/// Thanks to Neco @ https://stackoverflow.com/questions/237807/net-sslstream-doesnt-close-tls-connection-properly/22626756#22626756
|
||||
/// </summary>
|
||||
internal class FtpSslStream : SslStream {
|
||||
|
||||
private bool sentCloseNotify = false;
|
||||
|
||||
public FtpSslStream(Stream innerStream)
|
||||
: base(innerStream) {
|
||||
}
|
||||
public FtpSslStream(Stream innerStream, bool leaveInnerStreamOpen)
|
||||
: base(innerStream, leaveInnerStreamOpen) {
|
||||
}
|
||||
public FtpSslStream(Stream innerStream, bool leaveInnerStreamOpen, RemoteCertificateValidationCallback userCertificateValidationCallback)
|
||||
: base(innerStream, leaveInnerStreamOpen, userCertificateValidationCallback) {
|
||||
}
|
||||
public FtpSslStream(Stream innerStream, bool leaveInnerStreamOpen, RemoteCertificateValidationCallback userCertificateValidationCallback, LocalCertificateSelectionCallback userCertificateSelectionCallback)
|
||||
: base(innerStream, leaveInnerStreamOpen, userCertificateValidationCallback, userCertificateSelectionCallback) {
|
||||
}
|
||||
#if !NET20 && !NET35
|
||||
public FtpSslStream(Stream innerStream, bool leaveInnerStreamOpen, RemoteCertificateValidationCallback userCertificateValidationCallback, LocalCertificateSelectionCallback userCertificateSelectionCallback, EncryptionPolicy encryptionPolicy)
|
||||
: base(innerStream, leaveInnerStreamOpen, userCertificateValidationCallback, userCertificateSelectionCallback, encryptionPolicy) {
|
||||
}
|
||||
#endif
|
||||
public override void Close() {
|
||||
try {
|
||||
if (!sentCloseNotify) {
|
||||
SslDirectCall.CloseNotify(this);
|
||||
sentCloseNotify = true;
|
||||
}
|
||||
} finally {
|
||||
base.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal unsafe static class SslDirectCall {
|
||||
/// <summary>
|
||||
/// Send an SSL close_notify alert.
|
||||
/// </summary>
|
||||
/// <param name="sslStream"></param>
|
||||
public static void CloseNotify(SslStream sslStream) {
|
||||
if (sslStream.IsAuthenticated && sslStream.CanWrite) {
|
||||
bool isServer = sslStream.IsServer;
|
||||
|
||||
byte[] result;
|
||||
int resultSz;
|
||||
var asmbSystem = typeof(System.Net.Authorization).Assembly;
|
||||
|
||||
int SCHANNEL_SHUTDOWN = 1;
|
||||
var workArray = BitConverter.GetBytes(SCHANNEL_SHUTDOWN);
|
||||
|
||||
var sslstate = FtpReflection.GetField(sslStream, "_SslState");
|
||||
var context = FtpReflection.GetProperty(sslstate, "Context");
|
||||
|
||||
var securityContext = FtpReflection.GetField(context, "m_SecurityContext");
|
||||
var securityContextHandleOriginal = FtpReflection.GetField(securityContext, "_handle");
|
||||
SslNativeApi.SSPIHandle securityContextHandle = default(SslNativeApi.SSPIHandle);
|
||||
securityContextHandle.HandleHi = (IntPtr)FtpReflection.GetField(securityContextHandleOriginal, "HandleHi");
|
||||
securityContextHandle.HandleLo = (IntPtr)FtpReflection.GetField(securityContextHandleOriginal, "HandleLo");
|
||||
|
||||
var credentialsHandle = FtpReflection.GetField(context, "m_CredentialsHandle");
|
||||
var credentialsHandleHandleOriginal = FtpReflection.GetField(credentialsHandle, "_handle");
|
||||
SslNativeApi.SSPIHandle credentialsHandleHandle = default(SslNativeApi.SSPIHandle);
|
||||
credentialsHandleHandle.HandleHi = (IntPtr)FtpReflection.GetField(credentialsHandleHandleOriginal, "HandleHi");
|
||||
credentialsHandleHandle.HandleLo = (IntPtr)FtpReflection.GetField(credentialsHandleHandleOriginal, "HandleLo");
|
||||
|
||||
int bufferSize = 1;
|
||||
SslNativeApi.SecurityBufferDescriptor securityBufferDescriptor = new SslNativeApi.SecurityBufferDescriptor(bufferSize);
|
||||
SslNativeApi.SecurityBufferStruct[] unmanagedBuffer = new SslNativeApi.SecurityBufferStruct[bufferSize];
|
||||
|
||||
fixed (SslNativeApi.SecurityBufferStruct* ptr = unmanagedBuffer)
|
||||
fixed (void* workArrayPtr = workArray) {
|
||||
securityBufferDescriptor.UnmanagedPointer = (void*)ptr;
|
||||
|
||||
unmanagedBuffer[0].token = (IntPtr)workArrayPtr;
|
||||
unmanagedBuffer[0].count = workArray.Length;
|
||||
unmanagedBuffer[0].type = SslNativeApi.BufferType.Token;
|
||||
|
||||
SslNativeApi.SecurityStatus status;
|
||||
status = (SslNativeApi.SecurityStatus)SslNativeApi.ApplyControlToken(ref securityContextHandle, securityBufferDescriptor);
|
||||
if (status == SslNativeApi.SecurityStatus.OK) {
|
||||
unmanagedBuffer[0].token = IntPtr.Zero;
|
||||
unmanagedBuffer[0].count = 0;
|
||||
unmanagedBuffer[0].type = SslNativeApi.BufferType.Token;
|
||||
|
||||
SslNativeApi.SSPIHandle contextHandleOut = default(SslNativeApi.SSPIHandle);
|
||||
SslNativeApi.ContextFlags outflags = SslNativeApi.ContextFlags.Zero;
|
||||
long ts = 0;
|
||||
|
||||
var inflags = SslNativeApi.ContextFlags.SequenceDetect |
|
||||
SslNativeApi.ContextFlags.ReplayDetect |
|
||||
SslNativeApi.ContextFlags.Confidentiality |
|
||||
SslNativeApi.ContextFlags.AcceptExtendedError |
|
||||
SslNativeApi.ContextFlags.AllocateMemory |
|
||||
SslNativeApi.ContextFlags.InitStream;
|
||||
|
||||
if (isServer) {
|
||||
status = (SslNativeApi.SecurityStatus)SslNativeApi.AcceptSecurityContext(ref credentialsHandleHandle, ref securityContextHandle, null,
|
||||
inflags, SslNativeApi.Endianness.Native, ref contextHandleOut, securityBufferDescriptor, ref outflags, out ts);
|
||||
} else {
|
||||
status = (SslNativeApi.SecurityStatus)SslNativeApi.InitializeSecurityContextW(ref credentialsHandleHandle, ref securityContextHandle, null,
|
||||
inflags, 0, SslNativeApi.Endianness.Native, null, 0, ref contextHandleOut, securityBufferDescriptor, ref outflags, out ts);
|
||||
}
|
||||
if (status == SslNativeApi.SecurityStatus.OK) {
|
||||
byte[] resultArr = new byte[unmanagedBuffer[0].count];
|
||||
Marshal.Copy(unmanagedBuffer[0].token, resultArr, 0, resultArr.Length);
|
||||
Marshal.FreeCoTaskMem(unmanagedBuffer[0].token);
|
||||
result = resultArr;
|
||||
resultSz = resultArr.Length;
|
||||
} else {
|
||||
throw new InvalidOperationException(string.Format("AcceptSecurityContext/InitializeSecurityContextW returned [{0}] during CloseNotify.", status));
|
||||
}
|
||||
} else {
|
||||
throw new InvalidOperationException(string.Format("ApplyControlToken returned [{0}] during CloseNotify.", status));
|
||||
}
|
||||
}
|
||||
|
||||
var innerStream = (Stream)FtpReflection.GetProperty(sslstate, "InnerStream");
|
||||
innerStream.Write(result, 0, resultSz);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal unsafe static class SslNativeApi {
|
||||
internal enum BufferType {
|
||||
Empty,
|
||||
Data,
|
||||
Token,
|
||||
Parameters,
|
||||
Missing,
|
||||
Extra,
|
||||
Trailer,
|
||||
Header,
|
||||
Padding = 9,
|
||||
Stream,
|
||||
ChannelBindings = 14,
|
||||
TargetHost = 16,
|
||||
ReadOnlyFlag = -2147483648,
|
||||
ReadOnlyWithChecksum = 268435456
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
internal struct SSPIHandle {
|
||||
public IntPtr HandleHi;
|
||||
public IntPtr HandleLo;
|
||||
public bool IsZero {
|
||||
get {
|
||||
return this.HandleHi == IntPtr.Zero && this.HandleLo == IntPtr.Zero;
|
||||
}
|
||||
}
|
||||
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
|
||||
internal void SetToInvalid() {
|
||||
this.HandleHi = IntPtr.Zero;
|
||||
this.HandleLo = IntPtr.Zero;
|
||||
}
|
||||
public override string ToString() {
|
||||
return this.HandleHi.ToString("x") + ":" + this.HandleLo.ToString("x");
|
||||
}
|
||||
}
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
internal class SecurityBufferDescriptor {
|
||||
public readonly int Version;
|
||||
public readonly int Count;
|
||||
public unsafe void* UnmanagedPointer;
|
||||
public SecurityBufferDescriptor(int count) {
|
||||
this.Version = 0;
|
||||
this.Count = count;
|
||||
this.UnmanagedPointer = null;
|
||||
}
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
internal struct SecurityBufferStruct {
|
||||
public int count;
|
||||
public BufferType type;
|
||||
public IntPtr token;
|
||||
public static readonly int Size = sizeof(SecurityBufferStruct);
|
||||
}
|
||||
|
||||
internal enum SecurityStatus {
|
||||
OK,
|
||||
ContinueNeeded = 590610,
|
||||
CompleteNeeded,
|
||||
CompAndContinue,
|
||||
ContextExpired = 590615,
|
||||
CredentialsNeeded = 590624,
|
||||
Renegotiate,
|
||||
OutOfMemory = -2146893056,
|
||||
InvalidHandle,
|
||||
Unsupported,
|
||||
TargetUnknown,
|
||||
InternalError,
|
||||
PackageNotFound,
|
||||
NotOwner,
|
||||
CannotInstall,
|
||||
InvalidToken,
|
||||
CannotPack,
|
||||
QopNotSupported,
|
||||
NoImpersonation,
|
||||
LogonDenied,
|
||||
UnknownCredentials,
|
||||
NoCredentials,
|
||||
MessageAltered,
|
||||
OutOfSequence,
|
||||
NoAuthenticatingAuthority,
|
||||
IncompleteMessage = -2146893032,
|
||||
IncompleteCredentials = -2146893024,
|
||||
BufferNotEnough,
|
||||
WrongPrincipal,
|
||||
TimeSkew = -2146893020,
|
||||
UntrustedRoot,
|
||||
IllegalMessage,
|
||||
CertUnknown,
|
||||
CertExpired,
|
||||
AlgorithmMismatch = -2146893007,
|
||||
SecurityQosFailed,
|
||||
SmartcardLogonRequired = -2146892994,
|
||||
UnsupportedPreauth = -2146892989,
|
||||
BadBinding = -2146892986
|
||||
}
|
||||
[Flags]
|
||||
internal enum ContextFlags {
|
||||
Zero = 0,
|
||||
Delegate = 1,
|
||||
MutualAuth = 2,
|
||||
ReplayDetect = 4,
|
||||
SequenceDetect = 8,
|
||||
Confidentiality = 16,
|
||||
UseSessionKey = 32,
|
||||
AllocateMemory = 256,
|
||||
Connection = 2048,
|
||||
InitExtendedError = 16384,
|
||||
AcceptExtendedError = 32768,
|
||||
InitStream = 32768,
|
||||
AcceptStream = 65536,
|
||||
InitIntegrity = 65536,
|
||||
AcceptIntegrity = 131072,
|
||||
InitManualCredValidation = 524288,
|
||||
InitUseSuppliedCreds = 128,
|
||||
InitIdentify = 131072,
|
||||
AcceptIdentify = 524288,
|
||||
ProxyBindings = 67108864,
|
||||
AllowMissingBindings = 268435456,
|
||||
UnverifiedTargetName = 536870912
|
||||
}
|
||||
internal enum Endianness {
|
||||
Network,
|
||||
Native = 16
|
||||
}
|
||||
|
||||
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
|
||||
[DllImport("secur32.dll", ExactSpelling = true, SetLastError = true)]
|
||||
internal static extern int ApplyControlToken(ref SSPIHandle contextHandle, [In] [Out] SecurityBufferDescriptor outputBuffer);
|
||||
|
||||
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
|
||||
[DllImport("secur32.dll", ExactSpelling = true, SetLastError = true)]
|
||||
internal unsafe static extern int AcceptSecurityContext(ref SSPIHandle credentialHandle, ref SSPIHandle contextHandle, [In] SecurityBufferDescriptor inputBuffer, [In] ContextFlags inFlags, [In] Endianness endianness, ref SSPIHandle outContextPtr, [In] [Out] SecurityBufferDescriptor outputBuffer, [In] [Out] ref ContextFlags attributes, out long timeStamp);
|
||||
|
||||
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
|
||||
[DllImport("secur32.dll", ExactSpelling = true, SetLastError = true)]
|
||||
internal unsafe static extern int InitializeSecurityContextW(ref SSPIHandle credentialHandle, ref SSPIHandle contextHandle, [In] byte* targetName, [In] ContextFlags inFlags, [In] int reservedI, [In] Endianness endianness, [In] SecurityBufferDescriptor inputBuffer, [In] int reservedII, ref SSPIHandle outContextPtr, [In] [Out] SecurityBufferDescriptor outputBuffer, [In] [Out] ref ContextFlags attributes, out long timeStamp);
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
@@ -1,363 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Globalization;
|
||||
#if (CORE || NETFX)
|
||||
using System.Diagnostics;
|
||||
#endif
|
||||
#if NET45
|
||||
using System.Threading.Tasks;
|
||||
using System.Collections;
|
||||
#endif
|
||||
|
||||
namespace FluentFTP {
|
||||
/// <summary>
|
||||
/// Extension methods related to FTP tasks
|
||||
/// </summary>
|
||||
public static class FtpExtensions {
|
||||
|
||||
/// <summary>
|
||||
/// Converts the specified path into a valid FTP file system path
|
||||
/// </summary>
|
||||
/// <param name="path">The file system path</param>
|
||||
/// <returns>A path formatted for FTP</returns>
|
||||
public static string GetFtpPath(this string path) {
|
||||
if (String.IsNullOrEmpty(path))
|
||||
return "./";
|
||||
|
||||
path = path.Replace('\\', '/');
|
||||
path = Regex.Replace(path, "[/]+", "/");
|
||||
path = path.TrimEnd('/');
|
||||
|
||||
if (path.Length == 0)
|
||||
path = "/";
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a valid FTP path by appending the specified segments to this string
|
||||
/// </summary>
|
||||
/// <param name="path">This string</param>
|
||||
/// <param name="segments">The path segments to append</param>
|
||||
/// <returns>A valid FTP path</returns>
|
||||
public static string GetFtpPath(this string path, params string[] segments) {
|
||||
if (String.IsNullOrEmpty(path))
|
||||
path = "./";
|
||||
|
||||
foreach (string part in segments) {
|
||||
if (part != null) {
|
||||
if (path.Length > 0 && !path.EndsWith("/"))
|
||||
path += "/";
|
||||
path += Regex.Replace(part.Replace('\\', '/'), "[/]+", "/").TrimEnd('/');
|
||||
}
|
||||
}
|
||||
|
||||
path = Regex.Replace(path.Replace('\\', '/'), "[/]+", "/").TrimEnd('/');
|
||||
if (path.Length == 0)
|
||||
path = "/";
|
||||
|
||||
/*if (!path.StartsWith("/") || !path.StartsWith("./"))
|
||||
path = "./" + path;*/
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the parent directory path (formatted for a FTP server)
|
||||
/// </summary>
|
||||
/// <param name="path">The path</param>
|
||||
/// <returns>The parent directory path</returns>
|
||||
public static string GetFtpDirectoryName(this string path) {
|
||||
string tpath = (path == null ? "" : path.GetFtpPath());
|
||||
|
||||
if (tpath.Length == 0 || tpath == "/")
|
||||
return "/";
|
||||
|
||||
int lastslash = tpath.LastIndexOf('/');
|
||||
if (lastslash < 0)
|
||||
return ".";
|
||||
if (lastslash == 0)
|
||||
return "/";
|
||||
|
||||
return tpath.Substring(0, lastslash);
|
||||
}
|
||||
|
||||
/*public static string GetFtpDirectoryName(this string path) {
|
||||
if (path == null || path.Length == 0 || path.GetFtpPath() == "/")
|
||||
return "/";
|
||||
|
||||
return System.IO.Path.GetDirectoryName(path).GetFtpPath();
|
||||
}*/
|
||||
|
||||
/// <summary>
|
||||
/// Gets the file name and extension from the path
|
||||
/// </summary>
|
||||
/// <param name="path">The full path to the file</param>
|
||||
/// <returns>The file name</returns>
|
||||
public static string GetFtpFileName(this string path) {
|
||||
string tpath = (path == null ? null : path);
|
||||
int lastslash = -1;
|
||||
|
||||
if (tpath == null)
|
||||
return null;
|
||||
|
||||
lastslash = tpath.LastIndexOf('/');
|
||||
if (lastslash < 0)
|
||||
return tpath;
|
||||
|
||||
lastslash += 1;
|
||||
if (lastslash >= tpath.Length)
|
||||
return tpath;
|
||||
|
||||
return tpath.Substring(lastslash, tpath.Length - lastslash);
|
||||
}
|
||||
|
||||
/*public static string GetFtpFileName(this string path) {
|
||||
return System.IO.Path.GetFileName(path).GetFtpPath();
|
||||
}*/
|
||||
|
||||
private static string[] FtpDateFormats = { "yyyyMMddHHmmss", "yyyyMMddHHmmss'.'f", "yyyyMMddHHmmss'.'ff", "yyyyMMddHHmmss'.'fff", "MMM dd yyyy","MMM d yyyy","MMM dd HH:mm","MMM d HH:mm" };
|
||||
|
||||
/// <summary>
|
||||
/// Tries to convert the string FTP date representation into a <see cref="DateTime"/> object
|
||||
/// </summary>
|
||||
/// <param name="date">The date</param>
|
||||
/// <param name="style">UTC/Local Time</param>
|
||||
/// <returns>A <see cref="DateTime"/> object representing the date, or <see cref="DateTime.MinValue"/> if there was a problem</returns>
|
||||
public static DateTime GetFtpDate(this string date, DateTimeStyles style) {
|
||||
DateTime parsed;
|
||||
|
||||
if (DateTime.TryParseExact(date, FtpDateFormats, CultureInfo.InvariantCulture, style, out parsed)) {
|
||||
return parsed;
|
||||
}
|
||||
|
||||
return DateTime.MinValue;
|
||||
}
|
||||
|
||||
private static string[] sizePostfix = { "bytes", "KB", "MB", "GB", "TB" };
|
||||
|
||||
/// <summary>
|
||||
/// Converts a file size in bytes to a string representation (eg. 12345 becomes 12.3 KB)
|
||||
/// </summary>
|
||||
public static string FileSizeToString(this int bytes) {
|
||||
return ((long)bytes).FileSizeToString();
|
||||
}
|
||||
/// <summary>
|
||||
/// Converts a file size in bytes to a string representation (eg. 12345 becomes 12.3 KB)
|
||||
/// </summary>
|
||||
public static string FileSizeToString(this uint bytes) {
|
||||
return ((long)bytes).FileSizeToString();
|
||||
}
|
||||
/// <summary>
|
||||
/// Converts a file size in bytes to a string representation (eg. 12345 becomes 12.3 KB)
|
||||
/// </summary>
|
||||
public static string FileSizeToString(this ulong bytes) {
|
||||
return ((long)bytes).FileSizeToString();
|
||||
}
|
||||
/// <summary>
|
||||
/// Converts a file size in bytes to a string representation (eg. 12345 becomes 12.3 KB)
|
||||
/// </summary>
|
||||
public static string FileSizeToString(this long bytes) {
|
||||
int order = 0;
|
||||
double len = bytes;
|
||||
while (len >= 1024 && order < sizePostfix.Length - 1) {
|
||||
order++;
|
||||
len = len / 1024;
|
||||
}
|
||||
return String.Format("{0:0.#} {1}", len, sizePostfix[order]);
|
||||
}
|
||||
|
||||
#if NET45
|
||||
/// <summary>
|
||||
/// This creates a <see cref="System.Threading.Tasks.Task{TResult}"/> that represents a pair of begin and end methods
|
||||
/// that conform to the Asynchronous Programming Model pattern. This extends the maximum amount of arguments from
|
||||
/// <see cref="o:System.Threading.TaskFactory.FromAsync"/> to 4 from a 3.
|
||||
/// </summary>
|
||||
/// <typeparam name="TArg1">The type of the first argument passed to the <paramref name="beginMethod"/> delegate</typeparam>
|
||||
/// <typeparam name="TArg2">The type of the second argument passed to the <paramref name="beginMethod"/> delegate</typeparam>
|
||||
/// <typeparam name="TArg3">The type of the third argument passed to the <paramref name="beginMethod"/> delegate</typeparam>
|
||||
/// <typeparam name="TArg4">The type of the forth argument passed to the <paramref name="beginMethod"/> delegate</typeparam>
|
||||
/// <typeparam name="TResult">The type of the result.</typeparam>
|
||||
/// <param name="factory">The <see cref="TaskFactory"/> used</param>
|
||||
/// <param name="beginMethod">The delegate that begins the asynchronous operation</param>
|
||||
/// <param name="endMethod">The delegate that ends the asynchronous operation</param>
|
||||
/// <param name="arg1">The first argument passed to the <paramref name="beginMethod"/> delegate</param>
|
||||
/// <param name="arg2">The second argument passed to the <paramref name="beginMethod"/> delegate</param>
|
||||
/// <param name="arg3">The third argument passed to the <paramref name="beginMethod"/> delegate</param>
|
||||
/// <param name="arg4">The forth argument passed to the <paramref name="beginMethod"/> delegate</param>
|
||||
/// <param name="state">An object containing data to be used by the <paramref name="beginMethod"/> delegate</param>
|
||||
/// <returns>The created <see cref="System.Threading.Tasks.Task{TResult}"/> that represents the asynchronous operation</returns>
|
||||
/// <exception cref="System.ArgumentNullException">
|
||||
/// beginMethod is null
|
||||
/// or
|
||||
/// endMethod is null
|
||||
/// </exception>
|
||||
public static Task<TResult> FromAsync<TArg1, TArg2, TArg3, TArg4, TResult>(this TaskFactory factory,
|
||||
Func<TArg1, TArg2, TArg3, TArg4, AsyncCallback, object, IAsyncResult> beginMethod,
|
||||
Func<IAsyncResult, TResult> endMethod,
|
||||
TArg1 arg1, TArg2 arg2, TArg3 arg3, TArg4 arg4, object state) {
|
||||
if (beginMethod == null)
|
||||
throw new ArgumentNullException("beginMethod");
|
||||
|
||||
if (endMethod == null)
|
||||
throw new ArgumentNullException("endMethod");
|
||||
|
||||
TaskCompletionSource<TResult> tcs = new TaskCompletionSource<TResult>(state, factory.CreationOptions);
|
||||
try {
|
||||
AsyncCallback callback = delegate(IAsyncResult asyncResult) {
|
||||
tcs.TrySetResult(endMethod(asyncResult));
|
||||
};
|
||||
|
||||
beginMethod(arg1, arg2, arg3, arg4, callback, state);
|
||||
}
|
||||
catch {
|
||||
tcs.TrySetResult(default(TResult));
|
||||
throw;
|
||||
}
|
||||
|
||||
return tcs.Task;
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Validates that the FtpError flags set are not in an invalid combination.
|
||||
/// </summary>
|
||||
/// <param name="options">The error handling options set</param>
|
||||
/// <returns>True if a valid combination, otherwise false</returns>
|
||||
public static bool IsValidCombination(this FtpError options) {
|
||||
return options != (FtpError.Stop | FtpError.Throw) &&
|
||||
options != (FtpError.Throw | FtpError.Stop | FtpError.DeleteProcessed);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if every character in the string is whitespace, or the string is null.
|
||||
/// </summary>
|
||||
public static bool IsNullOrWhiteSpace(string value) {
|
||||
if (value == null) return true;
|
||||
|
||||
for (int i = 0; i < value.Length; i++) {
|
||||
if (!Char.IsWhiteSpace(value[i])) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the string is null or 0 length.
|
||||
/// </summary>
|
||||
public static bool IsBlank(this string value) {
|
||||
return value == null || value.Length == 0;
|
||||
}
|
||||
|
||||
#if NET45
|
||||
/// <summary>
|
||||
/// Checks if the array is null or 0 length.
|
||||
/// </summary>
|
||||
public static bool IsBlank(this IList value) {
|
||||
return value == null || value.Count == 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the array is null or 0 length.
|
||||
/// </summary>
|
||||
public static bool IsBlank(this IEnumerable value) {
|
||||
if (value == null){
|
||||
return true;
|
||||
}
|
||||
if (value is IList){
|
||||
return ((IList)value).Count == 0;
|
||||
}
|
||||
if (value is byte[]){
|
||||
return ((byte[])value).Length == 0;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Join the given strings by a delimiter.
|
||||
/// </summary>
|
||||
public static string Join(this string[] values, string delimiter) {
|
||||
return string.Join(delimiter, values);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Join the given strings by a delimiter.
|
||||
/// </summary>
|
||||
public static string Join(this List<string> values, string delimiter) {
|
||||
#if NET20 || NET35
|
||||
return string.Join(delimiter, values.ToArray());
|
||||
#else
|
||||
return string.Join(delimiter, values);
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a prefix to the given strings, returns a new array.
|
||||
/// </summary>
|
||||
public static string[] AddPrefix(this string[] values, string prefix, bool trim = false) {
|
||||
List<string> results = new List<string>();
|
||||
foreach (string v in values) {
|
||||
string txt = prefix + (trim ? v.Trim() : v);
|
||||
results.Add(txt);
|
||||
}
|
||||
return results.ToArray();
|
||||
}
|
||||
/// <summary>
|
||||
/// Adds a prefix to the given strings, returns a new array.
|
||||
/// </summary>
|
||||
public static List<string> AddPrefix(this List<string> values, string prefix, bool trim = false) {
|
||||
List<string> results = new List<string>();
|
||||
foreach (string v in values) {
|
||||
string txt = prefix + (trim ? v.Trim() : v);
|
||||
results.Add(txt);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a prefix to the given strings, returns a new array.
|
||||
/// </summary>
|
||||
public static List<string> ItemsToString(this object[] args) {
|
||||
List<string> results = new List<string>();
|
||||
if (args == null) {
|
||||
return results;
|
||||
}
|
||||
foreach (object v in args) {
|
||||
string txt;
|
||||
if (v == null){
|
||||
txt = "null";
|
||||
} else if (v is string) {
|
||||
txt = ("\"" + v as string + "\"");
|
||||
} else {
|
||||
txt = v.ToString();
|
||||
}
|
||||
results.Add(txt);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
#if NET20 || NET35
|
||||
public static bool HasFlag(this FtpHashAlgorithm flags, FtpHashAlgorithm flag) {
|
||||
return (flags & flag) == flag;
|
||||
}
|
||||
public static bool HasFlag(this FtpCapability flags, FtpCapability flag) {
|
||||
return (flags & flag) == flag;
|
||||
}
|
||||
public static bool HasFlag(this FtpVerify flags, FtpVerify flag) {
|
||||
return (flags & flag) == flag;
|
||||
}
|
||||
public static bool HasFlag(this FtpError flags, FtpError flag) {
|
||||
return (flags & flag) == flag;
|
||||
}
|
||||
public static void Restart(this Stopwatch watch) {
|
||||
watch.Stop();
|
||||
watch.Start();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,82 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
#if !CORE
|
||||
using System.Reflection;
|
||||
using System.Linq;
|
||||
#endif
|
||||
|
||||
namespace FluentFTP {
|
||||
internal static class FtpReflection {
|
||||
|
||||
#if !CORE
|
||||
public static object GetField(this object obj, string fieldName) {
|
||||
var tp = obj.GetType();
|
||||
var info = GetAllFields(tp).Where(f => f.Name == fieldName).Single();
|
||||
return info.GetValue(obj);
|
||||
}
|
||||
public static void SetField(this object obj, string fieldName, object value) {
|
||||
var tp = obj.GetType();
|
||||
var info = GetAllFields(tp).Where(f => f.Name == fieldName).Single();
|
||||
info.SetValue(obj, value);
|
||||
}
|
||||
public static object GetStaticField(this Assembly assembly, string typeName, string fieldName) {
|
||||
var tp = assembly.GetType(typeName);
|
||||
var info = GetAllFields(tp).Where(f => f.IsStatic).Where(f => f.Name == fieldName).Single();
|
||||
return info.GetValue(null);
|
||||
}
|
||||
|
||||
public static object GetProperty(this object obj, string propertyName) {
|
||||
var tp = obj.GetType();
|
||||
var info = GetAllProperties(tp).Where(f => f.Name == propertyName).Single();
|
||||
return info.GetValue(obj, null);
|
||||
}
|
||||
public static object CallMethod(this object obj, string methodName, params object[] prm) {
|
||||
var tp = obj.GetType();
|
||||
var info = GetAllMethods(tp).Where(f => f.Name == methodName && f.GetParameters().Length == prm.Length).Single();
|
||||
object rez = info.Invoke(obj, prm);
|
||||
return rez;
|
||||
}
|
||||
public static object NewInstance(this Assembly assembly, string typeName, params object[] prm) {
|
||||
var tp = assembly.GetType(typeName);
|
||||
var info = tp.GetConstructors().Where(f => f.GetParameters().Length == prm.Length).Single();
|
||||
object rez = info.Invoke(prm);
|
||||
return rez;
|
||||
}
|
||||
public static object InvokeStaticMethod(this Assembly assembly, string typeName, string methodName, params object[] prm) {
|
||||
var tp = assembly.GetType(typeName);
|
||||
var info = GetAllMethods(tp).Where(f => f.IsStatic).Where(f => f.Name == methodName && f.GetParameters().Length == prm.Length).Single();
|
||||
object rez = info.Invoke(null, prm);
|
||||
return rez;
|
||||
}
|
||||
public static object GetEnumValue(this Assembly assembly, string typeName, int value) {
|
||||
var tp = assembly.GetType(typeName);
|
||||
object rez = Enum.ToObject(tp, value);
|
||||
return rez;
|
||||
}
|
||||
|
||||
private static IEnumerable<FieldInfo> GetAllFields(Type t) {
|
||||
if (t == null)
|
||||
return Enumerable.Empty<FieldInfo>();
|
||||
|
||||
BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly;
|
||||
return t.GetFields(flags).Concat(GetAllFields(t.BaseType));
|
||||
}
|
||||
private static IEnumerable<PropertyInfo> GetAllProperties(Type t) {
|
||||
if (t == null)
|
||||
return Enumerable.Empty<PropertyInfo>();
|
||||
|
||||
BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly;
|
||||
return t.GetProperties(flags).Concat(GetAllProperties(t.BaseType));
|
||||
}
|
||||
private static IEnumerable<MethodInfo> GetAllMethods(Type t) {
|
||||
if (t == null)
|
||||
return Enumerable.Empty<MethodInfo>();
|
||||
|
||||
BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly;
|
||||
return t.GetMethods(flags).Concat(GetAllMethods(t.BaseType));
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,293 +1,267 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{9CB860CD-211C-48CB-8A9A-6CA87B74ED7B}</ProjectGuid>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>NewsCrawler</RootNamespace>
|
||||
<AssemblyName>NewsCrawler</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||
<PublishUrl>publish\</PublishUrl>
|
||||
<Install>true</Install>
|
||||
<InstallFrom>Disk</InstallFrom>
|
||||
<UpdateEnabled>false</UpdateEnabled>
|
||||
<UpdateMode>Foreground</UpdateMode>
|
||||
<UpdateInterval>7</UpdateInterval>
|
||||
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||
<UpdatePeriodically>false</UpdatePeriodically>
|
||||
<UpdateRequired>false</UpdateRequired>
|
||||
<MapFileExtensions>true</MapFileExtensions>
|
||||
<ApplicationRevision>2</ApplicationRevision>
|
||||
<ApplicationVersion>0.1.0.%2a</ApplicationVersion>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<PublishWizardCompleted>true</PublishWizardCompleted>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>TRACE;DEBUG;ASYNC;NET45</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32Bit>true</Prefer32Bit>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE;ASYNC;NET45</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ManifestCertificateThumbprint>3313DBEFFBEC4C1DB9EB9C32C7AE16B7932B4A65</ManifestCertificateThumbprint>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ManifestKeyFile>NewsCrawler_TemporaryKey.pfx</ManifestKeyFile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<GenerateManifests>false</GenerateManifests>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<SignManifests>false</SignManifests>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<TargetZone>LocalIntranet</TargetZone>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ApplicationIcon>icon.ico</ApplicationIcon>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="EPPlus, Version=4.1.0.0, Culture=neutral, PublicKeyToken=ea159fdaa78159a1, processorArchitecture=MSIL">
|
||||
<HintPath>packages\EPPlus.4.1.0\lib\net40\EPPlus.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="HtmlAgilityPack">
|
||||
<HintPath>HtmlAgility\HtmlAgilityPack.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Configuration" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.Web" />
|
||||
<Reference Include="System.Web.Extensions" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Deployment" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="FileTransfer.cs" />
|
||||
<Compile Include="FluentFTP\Client\FtpClient_Connection.cs" />
|
||||
<Compile Include="FluentFTP\Client\FtpClient_Hash.cs" />
|
||||
<Compile Include="FluentFTP\Client\FtpClient_HighLevel.cs" />
|
||||
<Compile Include="FluentFTP\Client\FtpClient_Listing.cs" />
|
||||
<Compile Include="FluentFTP\Client\FtpClient_LowLevel.cs" />
|
||||
<Compile Include="FluentFTP\Client\FtpClient_Management.cs" />
|
||||
<Compile Include="FluentFTP\Client\IFtpClient.cs" />
|
||||
<Compile Include="FluentFTP\Helpers\FtpEnums.cs" />
|
||||
<Compile Include="FluentFTP\Helpers\FtpEvents.cs" />
|
||||
<Compile Include="FluentFTP\Helpers\FtpExceptions.cs" />
|
||||
<Compile Include="FluentFTP\Helpers\FtpHash.cs" />
|
||||
<Compile Include="FluentFTP\Helpers\FtpListItem.cs" />
|
||||
<Compile Include="FluentFTP\Helpers\FtpListParser.cs" />
|
||||
<Compile Include="FluentFTP\Helpers\FtpReply.cs" />
|
||||
<Compile Include="FluentFTP\Helpers\FtpTrace.cs" />
|
||||
<Compile Include="FluentFTP\Helpers\IntRef.cs" />
|
||||
<Compile Include="FluentFTP\Proxy\FtpClientHttp11Proxy.cs" />
|
||||
<Compile Include="FluentFTP\Proxy\FtpClientProxy.cs" />
|
||||
<Compile Include="FluentFTP\Proxy\FtpClientUserAtHostProxy.cs" />
|
||||
<Compile Include="FluentFTP\Proxy\FtpClientUserAtHostProxyBlueCoat.cs" />
|
||||
<Compile Include="FluentFTP\Proxy\ProxyInfo.cs" />
|
||||
<Compile Include="FluentFTP\Stream\FtpDataStream.cs" />
|
||||
<Compile Include="FluentFTP\Stream\FtpSocketStream.cs" />
|
||||
<Compile Include="FluentFTP\Stream\FtpSslStream.cs" />
|
||||
<Compile Include="FluentFTP\Utils\FtpExtensions.cs" />
|
||||
<Compile Include="FluentFTP\Utils\FtpReflection.cs" />
|
||||
<Compile Include="FluentFTP\Utils\NET2Compatibility.cs" />
|
||||
<Compile Include="ListViewNF.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CodeList.cs" />
|
||||
<Compile Include="Config.cs" />
|
||||
<Compile Include="ConfigForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ConfigForm.Designer.cs">
|
||||
<DependentUpon>ConfigForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Crawler.cs" />
|
||||
<Compile Include="CybosHelper.cs" />
|
||||
<Compile Include="ExcelHandler.cs" />
|
||||
<Compile Include="ModelessPopup.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ModelessPopup.Designer.cs">
|
||||
<DependentUpon>ModelessPopup.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="NewsForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="NewsForm.Designer.cs">
|
||||
<DependentUpon>NewsForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="TextCondition.cs" />
|
||||
<Compile Include="Util.cs" />
|
||||
<EmbeddedResource Include="ConfigForm.resx">
|
||||
<DependentUpon>ConfigForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="ModelessPopup.resx">
|
||||
<DependentUpon>ModelessPopup.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="NewsForm.resx">
|
||||
<DependentUpon>NewsForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<Compile Include="Properties\Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
<DesignTime>True</DesignTime>
|
||||
</Compile>
|
||||
<None Include="app.manifest" />
|
||||
<None Include="packages.config" />
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<Compile Include="Properties\Settings.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<COMReference Include="CPFOREDIBLIB">
|
||||
<Guid>{ABA39D6F-5AF4-4D10-8389-031055C13A75}</Guid>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>0</VersionMinor>
|
||||
<Lcid>0</Lcid>
|
||||
<WrapperTool>tlbimp</WrapperTool>
|
||||
<Isolated>False</Isolated>
|
||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||
</COMReference>
|
||||
<COMReference Include="CPFORETRADELib">
|
||||
<Guid>{1E3BC2CB-4AC7-46BB-AF63-11DEA8628E3C}</Guid>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>0</VersionMinor>
|
||||
<Lcid>0</Lcid>
|
||||
<WrapperTool>tlbimp</WrapperTool>
|
||||
<Isolated>False</Isolated>
|
||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||
</COMReference>
|
||||
<COMReference Include="CpIndexesLib">
|
||||
<Guid>{3DC4496B-C823-4440-ABD4-A248A716F7C6}</Guid>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>0</VersionMinor>
|
||||
<Lcid>0</Lcid>
|
||||
<WrapperTool>tlbimp</WrapperTool>
|
||||
<Isolated>False</Isolated>
|
||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||
</COMReference>
|
||||
<COMReference Include="CPSYSDIBLib">
|
||||
<Guid>{9C31B76A-7189-49A3-9781-3C6DD6ED5AD3}</Guid>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>0</VersionMinor>
|
||||
<Lcid>0</Lcid>
|
||||
<WrapperTool>tlbimp</WrapperTool>
|
||||
<Isolated>False</Isolated>
|
||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||
</COMReference>
|
||||
<COMReference Include="CPTRADELib">
|
||||
<Guid>{1F7D5E5A-05AB-4236-B6F3-3D383B09203A}</Guid>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>0</VersionMinor>
|
||||
<Lcid>0</Lcid>
|
||||
<WrapperTool>tlbimp</WrapperTool>
|
||||
<Isolated>False</Isolated>
|
||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||
</COMReference>
|
||||
<COMReference Include="CPUTILLib">
|
||||
<Guid>{2DA9C35C-FE59-4A32-A942-325EE8A6F659}</Guid>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>0</VersionMinor>
|
||||
<Lcid>0</Lcid>
|
||||
<WrapperTool>tlbimp</WrapperTool>
|
||||
<Isolated>False</Isolated>
|
||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||
</COMReference>
|
||||
<COMReference Include="DSCBO1Lib">
|
||||
<Guid>{859343F1-08FD-11D4-8231-00105A7C4F8C}</Guid>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>0</VersionMinor>
|
||||
<Lcid>0</Lcid>
|
||||
<WrapperTool>tlbimp</WrapperTool>
|
||||
<Isolated>False</Isolated>
|
||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||
</COMReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<BootstrapperPackage Include=".NETFramework,Version=v4.5.2">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>Microsoft .NET Framework 4.5.2 %28x86 and x64%29</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="icon.ico" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<PropertyGroup>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{9CB860CD-211C-48CB-8A9A-6CA87B74ED7B}</ProjectGuid>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>NewsCrawler</RootNamespace>
|
||||
<AssemblyName>NewsCrawler</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||
<IsWebBootstrapper>false</IsWebBootstrapper>
|
||||
<PublishUrl>publish\</PublishUrl>
|
||||
<Install>true</Install>
|
||||
<InstallFrom>Disk</InstallFrom>
|
||||
<UpdateEnabled>false</UpdateEnabled>
|
||||
<UpdateMode>Foreground</UpdateMode>
|
||||
<UpdateInterval>7</UpdateInterval>
|
||||
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
|
||||
<UpdatePeriodically>false</UpdatePeriodically>
|
||||
<UpdateRequired>false</UpdateRequired>
|
||||
<MapFileExtensions>true</MapFileExtensions>
|
||||
<ApplicationRevision>2</ApplicationRevision>
|
||||
<ApplicationVersion>0.1.0.%2a</ApplicationVersion>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<PublishWizardCompleted>true</PublishWizardCompleted>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>TRACE;DEBUG;ASYNC;NET45</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32Bit>true</Prefer32Bit>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE;ASYNC;NET45</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ManifestCertificateThumbprint>3313DBEFFBEC4C1DB9EB9C32C7AE16B7932B4A65</ManifestCertificateThumbprint>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ManifestKeyFile>NewsCrawler_TemporaryKey.pfx</ManifestKeyFile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<GenerateManifests>false</GenerateManifests>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<SignManifests>false</SignManifests>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<TargetZone>LocalIntranet</TargetZone>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<ApplicationIcon>icon.ico</ApplicationIcon>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="EPPlus, Version=4.1.0.0, Culture=neutral, PublicKeyToken=ea159fdaa78159a1, processorArchitecture=MSIL">
|
||||
<HintPath>packages\EPPlus.4.1.0\lib\net40\EPPlus.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="HtmlAgilityPack">
|
||||
<HintPath>HtmlAgility\HtmlAgilityPack.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<HintPath>packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
<Private>True</Private>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Configuration" />
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.IO.Compression" />
|
||||
<Reference Include="System.ServiceModel" />
|
||||
<Reference Include="System.Web" />
|
||||
<Reference Include="System.Web.Extensions" />
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Deployment" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="ListViewNF.cs">
|
||||
<SubType>Component</SubType>
|
||||
</Compile>
|
||||
<Compile Include="CodeList.cs" />
|
||||
<Compile Include="Config.cs" />
|
||||
<Compile Include="ConfigForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ConfigForm.Designer.cs">
|
||||
<DependentUpon>ConfigForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Crawler.cs" />
|
||||
<Compile Include="CybosHelper.cs" />
|
||||
<Compile Include="ExcelHandler.cs" />
|
||||
<Compile Include="ModelessPopup.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="ModelessPopup.Designer.cs">
|
||||
<DependentUpon>ModelessPopup.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="NewsForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="NewsForm.Designer.cs">
|
||||
<DependentUpon>NewsForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="TextCondition.cs" />
|
||||
<Compile Include="Util.cs" />
|
||||
<EmbeddedResource Include="ConfigForm.resx">
|
||||
<DependentUpon>ConfigForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="ModelessPopup.resx">
|
||||
<DependentUpon>ModelessPopup.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="NewsForm.resx">
|
||||
<DependentUpon>NewsForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<Compile Include="Properties\Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
<DesignTime>True</DesignTime>
|
||||
</Compile>
|
||||
<None Include="app.manifest" />
|
||||
<None Include="packages.config" />
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<Compile Include="Properties\Settings.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<COMReference Include="CPFOREDIBLIB">
|
||||
<Guid>{ABA39D6F-5AF4-4D10-8389-031055C13A75}</Guid>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>0</VersionMinor>
|
||||
<Lcid>0</Lcid>
|
||||
<WrapperTool>tlbimp</WrapperTool>
|
||||
<Isolated>False</Isolated>
|
||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||
</COMReference>
|
||||
<COMReference Include="CPFORETRADELib">
|
||||
<Guid>{1E3BC2CB-4AC7-46BB-AF63-11DEA8628E3C}</Guid>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>0</VersionMinor>
|
||||
<Lcid>0</Lcid>
|
||||
<WrapperTool>tlbimp</WrapperTool>
|
||||
<Isolated>False</Isolated>
|
||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||
</COMReference>
|
||||
<COMReference Include="CpIndexesLib">
|
||||
<Guid>{3DC4496B-C823-4440-ABD4-A248A716F7C6}</Guid>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>0</VersionMinor>
|
||||
<Lcid>0</Lcid>
|
||||
<WrapperTool>tlbimp</WrapperTool>
|
||||
<Isolated>False</Isolated>
|
||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||
</COMReference>
|
||||
<COMReference Include="CPSYSDIBLib">
|
||||
<Guid>{9C31B76A-7189-49A3-9781-3C6DD6ED5AD3}</Guid>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>0</VersionMinor>
|
||||
<Lcid>0</Lcid>
|
||||
<WrapperTool>tlbimp</WrapperTool>
|
||||
<Isolated>False</Isolated>
|
||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||
</COMReference>
|
||||
<COMReference Include="CPTRADELib">
|
||||
<Guid>{1F7D5E5A-05AB-4236-B6F3-3D383B09203A}</Guid>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>0</VersionMinor>
|
||||
<Lcid>0</Lcid>
|
||||
<WrapperTool>tlbimp</WrapperTool>
|
||||
<Isolated>False</Isolated>
|
||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||
</COMReference>
|
||||
<COMReference Include="CPUTILLib">
|
||||
<Guid>{2DA9C35C-FE59-4A32-A942-325EE8A6F659}</Guid>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>0</VersionMinor>
|
||||
<Lcid>0</Lcid>
|
||||
<WrapperTool>tlbimp</WrapperTool>
|
||||
<Isolated>False</Isolated>
|
||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||
</COMReference>
|
||||
<COMReference Include="DSCBO1Lib">
|
||||
<Guid>{859343F1-08FD-11D4-8231-00105A7C4F8C}</Guid>
|
||||
<VersionMajor>1</VersionMajor>
|
||||
<VersionMinor>0</VersionMinor>
|
||||
<Lcid>0</Lcid>
|
||||
<WrapperTool>tlbimp</WrapperTool>
|
||||
<Isolated>False</Isolated>
|
||||
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||
</COMReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<BootstrapperPackage Include=".NETFramework,Version=v4.5.2">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>Microsoft .NET Framework 4.5.2 %28x86 and x64%29</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="icon.ico" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>if NOT "$(ConfigurationName)" == "Release" (goto :nocopy)
|
||||
|
||||
copy $(TargetPath) $(ProjectDir)publish\ /y
|
||||
copy $(TargetDir)*.dll $(ProjectDir)publish\ /y
|
||||
|
||||
:nocopy
|
||||
</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
-->
|
||||
</Project>
|
||||
676
NewsForm.Designer.cs
generated
676
NewsForm.Designer.cs
generated
@@ -28,336 +28,352 @@
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NewsForm));
|
||||
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
|
||||
this.lvList = new NewsCrawler.ListViewNF();
|
||||
this.chId = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chResT = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chResponseT = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chReference = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chTitle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chCodeName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chPriceS = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chPriceLow = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chPriceLowP = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chPriceHigh = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chPriceHighP = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chLink = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.statusBar = new System.Windows.Forms.StatusStrip();
|
||||
this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
|
||||
this.toolStripStatusLabel2 = new System.Windows.Forms.ToolStripStatusLabel();
|
||||
this.toolStripStatusLabel3 = new System.Windows.Forms.ToolStripStatusLabel();
|
||||
this.toolStripStatusLabel4 = new System.Windows.Forms.ToolStripStatusLabel();
|
||||
this.tbLog = new System.Windows.Forms.RichTextBox();
|
||||
this.chAutoReload = new System.Windows.Forms.CheckBox();
|
||||
this.chAutoSelect = new System.Windows.Forms.CheckBox();
|
||||
this.tbInterval = new System.Windows.Forms.TextBox();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.btnConfig = new System.Windows.Forms.Button();
|
||||
this.chBuy = new System.Windows.Forms.CheckBox();
|
||||
this.cbPriceCheck = new System.Windows.Forms.CheckBox();
|
||||
this.btnManualBuy = new System.Windows.Forms.Button();
|
||||
this.btClearDuplicate = new System.Windows.Forms.Button();
|
||||
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
|
||||
this.splitContainer1.Panel1.SuspendLayout();
|
||||
this.splitContainer1.Panel2.SuspendLayout();
|
||||
this.splitContainer1.SuspendLayout();
|
||||
this.statusBar.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// splitContainer1
|
||||
//
|
||||
this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.splitContainer1.Location = new System.Drawing.Point(0, 27);
|
||||
this.splitContainer1.Name = "splitContainer1";
|
||||
this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
|
||||
//
|
||||
// splitContainer1.Panel1
|
||||
//
|
||||
this.splitContainer1.Panel1.Controls.Add(this.lvList);
|
||||
//
|
||||
// splitContainer1.Panel2
|
||||
//
|
||||
this.splitContainer1.Panel2.Controls.Add(this.statusBar);
|
||||
this.splitContainer1.Panel2.Controls.Add(this.tbLog);
|
||||
this.splitContainer1.Size = new System.Drawing.Size(1040, 625);
|
||||
this.splitContainer1.SplitterDistance = 455;
|
||||
this.splitContainer1.TabIndex = 2;
|
||||
//
|
||||
// lvList
|
||||
//
|
||||
this.lvList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
|
||||
this.chId,
|
||||
this.chTime,
|
||||
this.chResT,
|
||||
this.chResponseT,
|
||||
this.chReference,
|
||||
this.chTitle,
|
||||
this.chCodeName,
|
||||
this.chPriceS,
|
||||
this.chPriceLow,
|
||||
this.chPriceLowP,
|
||||
this.chPriceHigh,
|
||||
this.chPriceHighP,
|
||||
this.chLink});
|
||||
this.lvList.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.lvList.FullRowSelect = true;
|
||||
this.lvList.GridLines = true;
|
||||
this.lvList.HideSelection = false;
|
||||
this.lvList.Location = new System.Drawing.Point(0, 0);
|
||||
this.lvList.MultiSelect = false;
|
||||
this.lvList.Name = "lvList";
|
||||
this.lvList.Size = new System.Drawing.Size(1040, 455);
|
||||
this.lvList.TabIndex = 0;
|
||||
this.lvList.UseCompatibleStateImageBehavior = false;
|
||||
this.lvList.View = System.Windows.Forms.View.Details;
|
||||
this.lvList.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lvList_ColumnClick);
|
||||
this.lvList.DoubleClick += new System.EventHandler(this.lvList_DoubleClick);
|
||||
//
|
||||
// chId
|
||||
//
|
||||
this.chId.Text = "ID";
|
||||
this.chId.Width = 29;
|
||||
//
|
||||
// chTime
|
||||
//
|
||||
this.chTime.Text = "기사 시간";
|
||||
//
|
||||
// chResT
|
||||
//
|
||||
this.chResT.Text = "받은 시간";
|
||||
this.chResT.Width = 66;
|
||||
//
|
||||
// chResponseT
|
||||
//
|
||||
this.chResponseT.Text = "요청 시간";
|
||||
this.chResponseT.Width = 69;
|
||||
//
|
||||
// chReference
|
||||
//
|
||||
this.chReference.Text = "출처";
|
||||
this.chReference.Width = 72;
|
||||
//
|
||||
// chTitle
|
||||
//
|
||||
this.chTitle.Text = "제목";
|
||||
this.chTitle.Width = 366;
|
||||
//
|
||||
// chCodeName
|
||||
//
|
||||
this.chCodeName.Text = "종목명";
|
||||
//
|
||||
// chPriceS
|
||||
//
|
||||
this.chPriceS.Text = "시가";
|
||||
this.chPriceS.Width = 65;
|
||||
//
|
||||
// chPriceLow
|
||||
//
|
||||
this.chPriceLow.Text = "최저가";
|
||||
this.chPriceLow.Width = 61;
|
||||
//
|
||||
// chPriceLowP
|
||||
//
|
||||
this.chPriceLowP.Text = "대비";
|
||||
this.chPriceLowP.Width = 33;
|
||||
//
|
||||
// chPriceHigh
|
||||
//
|
||||
this.chPriceHigh.Text = "최고가";
|
||||
this.chPriceHigh.Width = 58;
|
||||
//
|
||||
// chPriceHighP
|
||||
//
|
||||
this.chPriceHighP.Text = "대비";
|
||||
this.chPriceHighP.Width = 35;
|
||||
//
|
||||
// chLink
|
||||
//
|
||||
this.chLink.Text = "링크";
|
||||
this.chLink.Width = 241;
|
||||
//
|
||||
// statusBar
|
||||
//
|
||||
this.statusBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.toolStripStatusLabel1,
|
||||
this.toolStripStatusLabel2,
|
||||
this.toolStripStatusLabel3,
|
||||
this.toolStripStatusLabel4});
|
||||
this.statusBar.Location = new System.Drawing.Point(0, 144);
|
||||
this.statusBar.Name = "statusBar";
|
||||
this.statusBar.Size = new System.Drawing.Size(1040, 22);
|
||||
this.statusBar.TabIndex = 1;
|
||||
this.statusBar.Text = "statusStrip1";
|
||||
//
|
||||
// toolStripStatusLabel1
|
||||
//
|
||||
this.toolStripStatusLabel1.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Right;
|
||||
this.toolStripStatusLabel1.Name = "toolStripStatusLabel1";
|
||||
this.toolStripStatusLabel1.Size = new System.Drawing.Size(4, 17);
|
||||
//
|
||||
// toolStripStatusLabel2
|
||||
//
|
||||
this.toolStripStatusLabel2.Name = "toolStripStatusLabel2";
|
||||
this.toolStripStatusLabel2.Size = new System.Drawing.Size(1017, 17);
|
||||
this.toolStripStatusLabel2.Spring = true;
|
||||
//
|
||||
// toolStripStatusLabel3
|
||||
//
|
||||
this.toolStripStatusLabel3.BorderSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right)));
|
||||
this.toolStripStatusLabel3.Name = "toolStripStatusLabel3";
|
||||
this.toolStripStatusLabel3.Size = new System.Drawing.Size(4, 17);
|
||||
//
|
||||
// toolStripStatusLabel4
|
||||
//
|
||||
this.toolStripStatusLabel4.Name = "toolStripStatusLabel4";
|
||||
this.toolStripStatusLabel4.Size = new System.Drawing.Size(0, 17);
|
||||
//
|
||||
// tbLog
|
||||
//
|
||||
this.tbLog.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.tbLog.BackColor = System.Drawing.SystemColors.Window;
|
||||
this.tbLog.Location = new System.Drawing.Point(0, 0);
|
||||
this.tbLog.Name = "tbLog";
|
||||
this.tbLog.ReadOnly = true;
|
||||
this.tbLog.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;
|
||||
this.tbLog.Size = new System.Drawing.Size(1040, 141);
|
||||
this.tbLog.TabIndex = 0;
|
||||
this.tbLog.Text = "";
|
||||
//
|
||||
// chAutoReload
|
||||
//
|
||||
this.chAutoReload.AutoSize = true;
|
||||
this.chAutoReload.Checked = true;
|
||||
this.chAutoReload.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||
this.chAutoReload.Location = new System.Drawing.Point(86, 7);
|
||||
this.chAutoReload.Name = "chAutoReload";
|
||||
this.chAutoReload.Size = new System.Drawing.Size(76, 16);
|
||||
this.chAutoReload.TabIndex = 3;
|
||||
this.chAutoReload.Text = "자동 갱신";
|
||||
this.chAutoReload.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// chAutoSelect
|
||||
//
|
||||
this.chAutoSelect.AutoSize = true;
|
||||
this.chAutoSelect.Checked = true;
|
||||
this.chAutoSelect.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||
this.chAutoSelect.Location = new System.Drawing.Point(168, 7);
|
||||
this.chAutoSelect.Name = "chAutoSelect";
|
||||
this.chAutoSelect.Size = new System.Drawing.Size(76, 16);
|
||||
this.chAutoSelect.TabIndex = 4;
|
||||
this.chAutoSelect.Text = "자동 선택";
|
||||
this.chAutoSelect.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// tbInterval
|
||||
//
|
||||
this.tbInterval.Location = new System.Drawing.Point(309, 5);
|
||||
this.tbInterval.Name = "tbInterval";
|
||||
this.tbInterval.Size = new System.Drawing.Size(42, 21);
|
||||
this.tbInterval.TabIndex = 5;
|
||||
this.tbInterval.Text = "0.5초";
|
||||
this.tbInterval.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
|
||||
this.tbInterval.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.tbInterval_KeyPress);
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(250, 8);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(53, 12);
|
||||
this.label1.TabIndex = 6;
|
||||
this.label1.Text = "갱신주기";
|
||||
//
|
||||
// btnConfig
|
||||
//
|
||||
this.btnConfig.Location = new System.Drawing.Point(2, 2);
|
||||
this.btnConfig.Name = "btnConfig";
|
||||
this.btnConfig.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnConfig.TabIndex = 7;
|
||||
this.btnConfig.Text = "설정";
|
||||
this.btnConfig.UseVisualStyleBackColor = true;
|
||||
this.btnConfig.Click += new System.EventHandler(this.btnConfig_Click);
|
||||
//
|
||||
// chBuy
|
||||
//
|
||||
this.chBuy.Appearance = System.Windows.Forms.Appearance.Button;
|
||||
this.chBuy.AutoSize = true;
|
||||
this.chBuy.Location = new System.Drawing.Point(439, 2);
|
||||
this.chBuy.Name = "chBuy";
|
||||
this.chBuy.Size = new System.Drawing.Size(39, 22);
|
||||
this.chBuy.TabIndex = 9;
|
||||
this.chBuy.Text = "매수";
|
||||
this.chBuy.UseVisualStyleBackColor = true;
|
||||
this.chBuy.CheckedChanged += new System.EventHandler(this.chBuy_CheckedChanged);
|
||||
//
|
||||
// cbPriceCheck
|
||||
//
|
||||
this.cbPriceCheck.AutoSize = true;
|
||||
this.cbPriceCheck.Checked = true;
|
||||
this.cbPriceCheck.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||
this.cbPriceCheck.Location = new System.Drawing.Point(357, 7);
|
||||
this.cbPriceCheck.Name = "cbPriceCheck";
|
||||
this.cbPriceCheck.Size = new System.Drawing.Size(76, 16);
|
||||
this.cbPriceCheck.TabIndex = 10;
|
||||
this.cbPriceCheck.Text = "가격 체크";
|
||||
this.cbPriceCheck.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// btnManualBuy
|
||||
//
|
||||
this.btnManualBuy.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btnManualBuy.Location = new System.Drawing.Point(961, 2);
|
||||
this.btnManualBuy.Name = "btnManualBuy";
|
||||
this.btnManualBuy.Size = new System.Drawing.Size(75, 23);
|
||||
this.btnManualBuy.TabIndex = 11;
|
||||
this.btnManualBuy.Text = "수동 매수";
|
||||
this.btnManualBuy.UseVisualStyleBackColor = true;
|
||||
this.btnManualBuy.Click += new System.EventHandler(this.btnManualBuy_Click);
|
||||
//
|
||||
// btClearDuplicate
|
||||
//
|
||||
this.btClearDuplicate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btClearDuplicate.Location = new System.Drawing.Point(864, 3);
|
||||
this.btClearDuplicate.Name = "btClearDuplicate";
|
||||
this.btClearDuplicate.Size = new System.Drawing.Size(91, 23);
|
||||
this.btClearDuplicate.TabIndex = 12;
|
||||
this.btClearDuplicate.Text = "중복종목 삭제";
|
||||
this.btClearDuplicate.UseVisualStyleBackColor = true;
|
||||
this.btClearDuplicate.Click += new System.EventHandler(this.btClearDuplicate_Click);
|
||||
//
|
||||
// NewsForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(1040, 649);
|
||||
this.Controls.Add(this.btClearDuplicate);
|
||||
this.Controls.Add(this.btnManualBuy);
|
||||
this.Controls.Add(this.splitContainer1);
|
||||
this.Controls.Add(this.cbPriceCheck);
|
||||
this.Controls.Add(this.chBuy);
|
||||
this.Controls.Add(this.btnConfig);
|
||||
this.Controls.Add(this.label1);
|
||||
this.Controls.Add(this.tbInterval);
|
||||
this.Controls.Add(this.chAutoSelect);
|
||||
this.Controls.Add(this.chAutoReload);
|
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||
this.Name = "NewsForm";
|
||||
this.Text = "News Crawler";
|
||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.NewsForm_FormClosing);
|
||||
this.splitContainer1.Panel1.ResumeLayout(false);
|
||||
this.splitContainer1.Panel2.ResumeLayout(false);
|
||||
this.splitContainer1.Panel2.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
|
||||
this.splitContainer1.ResumeLayout(false);
|
||||
this.statusBar.ResumeLayout(false);
|
||||
this.statusBar.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(NewsForm));
|
||||
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
|
||||
this.lvList = new NewsCrawler.ListViewNF();
|
||||
this.chId = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chResT = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chResponseT = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chReference = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chTitle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chCodeName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chPriceS = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chPriceLow = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chPriceLowP = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chPriceHigh = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chPriceHighP = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.chLink = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.statusBar = new System.Windows.Forms.StatusStrip();
|
||||
this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
|
||||
this.toolStripStatusLabel2 = new System.Windows.Forms.ToolStripStatusLabel();
|
||||
this.toolStripStatusLabel3 = new System.Windows.Forms.ToolStripStatusLabel();
|
||||
this.toolStripStatusLabel4 = new System.Windows.Forms.ToolStripStatusLabel();
|
||||
this.tbLog = new System.Windows.Forms.RichTextBox();
|
||||
this.chAutoReload = new System.Windows.Forms.CheckBox();
|
||||
this.chAutoSelect = new System.Windows.Forms.CheckBox();
|
||||
this.tbInterval = new System.Windows.Forms.TextBox();
|
||||
this.label1 = new System.Windows.Forms.Label();
|
||||
this.btnConfig = new System.Windows.Forms.Button();
|
||||
this.chBuy = new System.Windows.Forms.CheckBox();
|
||||
this.cbPriceCheck = new System.Windows.Forms.CheckBox();
|
||||
this.btnManualBuy = new System.Windows.Forms.Button();
|
||||
this.btClearDuplicate = new System.Windows.Forms.Button();
|
||||
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
|
||||
this.splitContainer1.Panel1.SuspendLayout();
|
||||
this.splitContainer1.Panel2.SuspendLayout();
|
||||
this.splitContainer1.SuspendLayout();
|
||||
this.statusBar.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// splitContainer1
|
||||
//
|
||||
this.splitContainer1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.splitContainer1.Location = new System.Drawing.Point(0, 40);
|
||||
this.splitContainer1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.splitContainer1.Name = "splitContainer1";
|
||||
this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
|
||||
//
|
||||
// splitContainer1.Panel1
|
||||
//
|
||||
this.splitContainer1.Panel1.Controls.Add(this.lvList);
|
||||
//
|
||||
// splitContainer1.Panel2
|
||||
//
|
||||
this.splitContainer1.Panel2.Controls.Add(this.statusBar);
|
||||
this.splitContainer1.Panel2.Controls.Add(this.tbLog);
|
||||
this.splitContainer1.Size = new System.Drawing.Size(1486, 938);
|
||||
this.splitContainer1.SplitterDistance = 682;
|
||||
this.splitContainer1.SplitterWidth = 6;
|
||||
this.splitContainer1.TabIndex = 2;
|
||||
//
|
||||
// lvList
|
||||
//
|
||||
this.lvList.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
|
||||
this.chId,
|
||||
this.chTime,
|
||||
this.chResT,
|
||||
this.chResponseT,
|
||||
this.chReference,
|
||||
this.chTitle,
|
||||
this.chCodeName,
|
||||
this.chPriceS,
|
||||
this.chPriceLow,
|
||||
this.chPriceLowP,
|
||||
this.chPriceHigh,
|
||||
this.chPriceHighP,
|
||||
this.chLink});
|
||||
this.lvList.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.lvList.FullRowSelect = true;
|
||||
this.lvList.GridLines = true;
|
||||
this.lvList.HideSelection = false;
|
||||
this.lvList.Location = new System.Drawing.Point(0, 0);
|
||||
this.lvList.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.lvList.MultiSelect = false;
|
||||
this.lvList.Name = "lvList";
|
||||
this.lvList.Size = new System.Drawing.Size(1486, 682);
|
||||
this.lvList.TabIndex = 0;
|
||||
this.lvList.UseCompatibleStateImageBehavior = false;
|
||||
this.lvList.View = System.Windows.Forms.View.Details;
|
||||
this.lvList.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lvList_ColumnClick);
|
||||
this.lvList.DoubleClick += new System.EventHandler(this.lvList_DoubleClick);
|
||||
//
|
||||
// chId
|
||||
//
|
||||
this.chId.Text = "ID";
|
||||
this.chId.Width = 29;
|
||||
//
|
||||
// chTime
|
||||
//
|
||||
this.chTime.Text = "기사 시간";
|
||||
//
|
||||
// chResT
|
||||
//
|
||||
this.chResT.Text = "받은 시간";
|
||||
this.chResT.Width = 66;
|
||||
//
|
||||
// chResponseT
|
||||
//
|
||||
this.chResponseT.Text = "요청 시간";
|
||||
this.chResponseT.Width = 69;
|
||||
//
|
||||
// chReference
|
||||
//
|
||||
this.chReference.Text = "출처";
|
||||
this.chReference.Width = 72;
|
||||
//
|
||||
// chTitle
|
||||
//
|
||||
this.chTitle.Text = "제목";
|
||||
this.chTitle.Width = 366;
|
||||
//
|
||||
// chCodeName
|
||||
//
|
||||
this.chCodeName.Text = "종목명";
|
||||
//
|
||||
// chPriceS
|
||||
//
|
||||
this.chPriceS.Text = "시가";
|
||||
this.chPriceS.Width = 65;
|
||||
//
|
||||
// chPriceLow
|
||||
//
|
||||
this.chPriceLow.Text = "최저가";
|
||||
this.chPriceLow.Width = 61;
|
||||
//
|
||||
// chPriceLowP
|
||||
//
|
||||
this.chPriceLowP.Text = "대비";
|
||||
this.chPriceLowP.Width = 33;
|
||||
//
|
||||
// chPriceHigh
|
||||
//
|
||||
this.chPriceHigh.Text = "최고가";
|
||||
this.chPriceHigh.Width = 58;
|
||||
//
|
||||
// chPriceHighP
|
||||
//
|
||||
this.chPriceHighP.Text = "대비";
|
||||
this.chPriceHighP.Width = 35;
|
||||
//
|
||||
// chLink
|
||||
//
|
||||
this.chLink.Text = "링크";
|
||||
this.chLink.Width = 241;
|
||||
//
|
||||
// statusBar
|
||||
//
|
||||
this.statusBar.ImageScalingSize = new System.Drawing.Size(24, 24);
|
||||
this.statusBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.toolStripStatusLabel1,
|
||||
this.toolStripStatusLabel2,
|
||||
this.toolStripStatusLabel3,
|
||||
this.toolStripStatusLabel4});
|
||||
this.statusBar.Location = new System.Drawing.Point(0, 228);
|
||||
this.statusBar.Name = "statusBar";
|
||||
this.statusBar.Padding = new System.Windows.Forms.Padding(1, 0, 20, 0);
|
||||
this.statusBar.Size = new System.Drawing.Size(1486, 22);
|
||||
this.statusBar.TabIndex = 1;
|
||||
this.statusBar.Text = "statusStrip1";
|
||||
//
|
||||
// toolStripStatusLabel1
|
||||
//
|
||||
this.toolStripStatusLabel1.BorderSides = System.Windows.Forms.ToolStripStatusLabelBorderSides.Right;
|
||||
this.toolStripStatusLabel1.Name = "toolStripStatusLabel1";
|
||||
this.toolStripStatusLabel1.Size = new System.Drawing.Size(4, 15);
|
||||
//
|
||||
// toolStripStatusLabel2
|
||||
//
|
||||
this.toolStripStatusLabel2.Name = "toolStripStatusLabel2";
|
||||
this.toolStripStatusLabel2.Size = new System.Drawing.Size(1457, 15);
|
||||
this.toolStripStatusLabel2.Spring = true;
|
||||
//
|
||||
// toolStripStatusLabel3
|
||||
//
|
||||
this.toolStripStatusLabel3.BorderSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Right)));
|
||||
this.toolStripStatusLabel3.Name = "toolStripStatusLabel3";
|
||||
this.toolStripStatusLabel3.Size = new System.Drawing.Size(4, 15);
|
||||
//
|
||||
// toolStripStatusLabel4
|
||||
//
|
||||
this.toolStripStatusLabel4.Name = "toolStripStatusLabel4";
|
||||
this.toolStripStatusLabel4.Size = new System.Drawing.Size(0, 15);
|
||||
//
|
||||
// tbLog
|
||||
//
|
||||
this.tbLog.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
||||
| System.Windows.Forms.AnchorStyles.Left)
|
||||
| System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.tbLog.BackColor = System.Drawing.SystemColors.Window;
|
||||
this.tbLog.Location = new System.Drawing.Point(0, 0);
|
||||
this.tbLog.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.tbLog.Name = "tbLog";
|
||||
this.tbLog.ReadOnly = true;
|
||||
this.tbLog.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical;
|
||||
this.tbLog.Size = new System.Drawing.Size(1484, 211);
|
||||
this.tbLog.TabIndex = 0;
|
||||
this.tbLog.Text = "";
|
||||
//
|
||||
// chAutoReload
|
||||
//
|
||||
this.chAutoReload.AutoSize = true;
|
||||
this.chAutoReload.Checked = true;
|
||||
this.chAutoReload.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||
this.chAutoReload.Location = new System.Drawing.Point(123, 10);
|
||||
this.chAutoReload.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.chAutoReload.Name = "chAutoReload";
|
||||
this.chAutoReload.Size = new System.Drawing.Size(112, 22);
|
||||
this.chAutoReload.TabIndex = 3;
|
||||
this.chAutoReload.Text = "자동 갱신";
|
||||
this.chAutoReload.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// chAutoSelect
|
||||
//
|
||||
this.chAutoSelect.AutoSize = true;
|
||||
this.chAutoSelect.Checked = true;
|
||||
this.chAutoSelect.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||
this.chAutoSelect.Location = new System.Drawing.Point(240, 10);
|
||||
this.chAutoSelect.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.chAutoSelect.Name = "chAutoSelect";
|
||||
this.chAutoSelect.Size = new System.Drawing.Size(112, 22);
|
||||
this.chAutoSelect.TabIndex = 4;
|
||||
this.chAutoSelect.Text = "자동 선택";
|
||||
this.chAutoSelect.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// tbInterval
|
||||
//
|
||||
this.tbInterval.Location = new System.Drawing.Point(441, 8);
|
||||
this.tbInterval.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.tbInterval.Name = "tbInterval";
|
||||
this.tbInterval.Size = new System.Drawing.Size(58, 28);
|
||||
this.tbInterval.TabIndex = 5;
|
||||
this.tbInterval.Text = "2초";
|
||||
this.tbInterval.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;
|
||||
this.tbInterval.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.tbInterval_KeyPress);
|
||||
//
|
||||
// label1
|
||||
//
|
||||
this.label1.AutoSize = true;
|
||||
this.label1.Location = new System.Drawing.Point(357, 12);
|
||||
this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
|
||||
this.label1.Name = "label1";
|
||||
this.label1.Size = new System.Drawing.Size(80, 18);
|
||||
this.label1.TabIndex = 6;
|
||||
this.label1.Text = "갱신주기";
|
||||
//
|
||||
// btnConfig
|
||||
//
|
||||
this.btnConfig.Location = new System.Drawing.Point(3, 3);
|
||||
this.btnConfig.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.btnConfig.Name = "btnConfig";
|
||||
this.btnConfig.Size = new System.Drawing.Size(107, 34);
|
||||
this.btnConfig.TabIndex = 7;
|
||||
this.btnConfig.Text = "설정";
|
||||
this.btnConfig.UseVisualStyleBackColor = true;
|
||||
this.btnConfig.Click += new System.EventHandler(this.btnConfig_Click);
|
||||
//
|
||||
// chBuy
|
||||
//
|
||||
this.chBuy.Appearance = System.Windows.Forms.Appearance.Button;
|
||||
this.chBuy.AutoSize = true;
|
||||
this.chBuy.Location = new System.Drawing.Point(627, 3);
|
||||
this.chBuy.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.chBuy.Name = "chBuy";
|
||||
this.chBuy.Size = new System.Drawing.Size(54, 28);
|
||||
this.chBuy.TabIndex = 9;
|
||||
this.chBuy.Text = "매수";
|
||||
this.chBuy.UseVisualStyleBackColor = true;
|
||||
this.chBuy.CheckedChanged += new System.EventHandler(this.chBuy_CheckedChanged);
|
||||
//
|
||||
// cbPriceCheck
|
||||
//
|
||||
this.cbPriceCheck.AutoSize = true;
|
||||
this.cbPriceCheck.Checked = true;
|
||||
this.cbPriceCheck.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||
this.cbPriceCheck.Location = new System.Drawing.Point(510, 10);
|
||||
this.cbPriceCheck.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.cbPriceCheck.Name = "cbPriceCheck";
|
||||
this.cbPriceCheck.Size = new System.Drawing.Size(112, 22);
|
||||
this.cbPriceCheck.TabIndex = 10;
|
||||
this.cbPriceCheck.Text = "가격 체크";
|
||||
this.cbPriceCheck.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// btnManualBuy
|
||||
//
|
||||
this.btnManualBuy.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btnManualBuy.Location = new System.Drawing.Point(1373, 3);
|
||||
this.btnManualBuy.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.btnManualBuy.Name = "btnManualBuy";
|
||||
this.btnManualBuy.Size = new System.Drawing.Size(107, 34);
|
||||
this.btnManualBuy.TabIndex = 11;
|
||||
this.btnManualBuy.Text = "수동 매수";
|
||||
this.btnManualBuy.UseVisualStyleBackColor = true;
|
||||
this.btnManualBuy.Click += new System.EventHandler(this.btnManualBuy_Click);
|
||||
//
|
||||
// btClearDuplicate
|
||||
//
|
||||
this.btClearDuplicate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
|
||||
this.btClearDuplicate.Location = new System.Drawing.Point(1234, 4);
|
||||
this.btClearDuplicate.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.btClearDuplicate.Name = "btClearDuplicate";
|
||||
this.btClearDuplicate.Size = new System.Drawing.Size(130, 34);
|
||||
this.btClearDuplicate.TabIndex = 12;
|
||||
this.btClearDuplicate.Text = "중복종목 삭제";
|
||||
this.btClearDuplicate.UseVisualStyleBackColor = true;
|
||||
this.btClearDuplicate.Click += new System.EventHandler(this.btClearDuplicate_Click);
|
||||
//
|
||||
// NewsForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 18F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(1486, 974);
|
||||
this.Controls.Add(this.btClearDuplicate);
|
||||
this.Controls.Add(this.btnManualBuy);
|
||||
this.Controls.Add(this.splitContainer1);
|
||||
this.Controls.Add(this.cbPriceCheck);
|
||||
this.Controls.Add(this.chBuy);
|
||||
this.Controls.Add(this.btnConfig);
|
||||
this.Controls.Add(this.label1);
|
||||
this.Controls.Add(this.tbInterval);
|
||||
this.Controls.Add(this.chAutoSelect);
|
||||
this.Controls.Add(this.chAutoReload);
|
||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
||||
this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
|
||||
this.Name = "NewsForm";
|
||||
this.Text = "News Crawler";
|
||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.NewsForm_FormClosing);
|
||||
this.splitContainer1.Panel1.ResumeLayout(false);
|
||||
this.splitContainer1.Panel2.ResumeLayout(false);
|
||||
this.splitContainer1.Panel2.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
|
||||
this.splitContainer1.ResumeLayout(false);
|
||||
this.statusBar.ResumeLayout(false);
|
||||
this.statusBar.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
24
NewsForm.cs
24
NewsForm.cs
@@ -76,7 +76,7 @@ namespace NewsCrawler
|
||||
DateTime m_EndTime;
|
||||
|
||||
System.Timers.Timer m_CrawlTimer = new System.Timers.Timer();
|
||||
int m_iCrawlInterval = 500;
|
||||
int m_iCrawlInterval = 2000;
|
||||
bool m_bBuy = false;
|
||||
|
||||
ConcurrentQueue<ListViewItem> m_NewItems = new ConcurrentQueue<ListViewItem>();
|
||||
@@ -612,18 +612,17 @@ namespace NewsCrawler
|
||||
m_CrawlTimer.Stop();
|
||||
|
||||
if(chAutoReload.Checked == true)
|
||||
{
|
||||
m_Crawler.ReadKIND();
|
||||
m_Crawler.ReadDart();
|
||||
if(Config.CheckDartAPI())
|
||||
m_Crawler.ReadDartAPI();
|
||||
m_Crawler.ReadEtoday();
|
||||
//m_Crawler.ReadEtoday2();
|
||||
{
|
||||
m_Crawler.ReadKIND();
|
||||
//m_Crawler.ReadDart();
|
||||
m_Crawler.ReadDartAPI();
|
||||
m_Crawler.ReadEtoday();
|
||||
//m_Crawler.ReadEtoday2();
|
||||
m_Crawler.ReadAsiaE();
|
||||
m_Crawler.ReadEdaily();
|
||||
m_Crawler.ReadMoneyToday();
|
||||
m_Crawler.ReadFinancialNews();
|
||||
|
||||
|
||||
}
|
||||
|
||||
m_CrawlTimer.Interval = m_iCrawlInterval;
|
||||
@@ -983,13 +982,6 @@ namespace NewsCrawler
|
||||
|
||||
if (m_bBuy == true)
|
||||
{
|
||||
//FileTransfer ft = new FileTransfer();
|
||||
//string today = DateTime.Now.ToString("yyyy-MM-dd");
|
||||
//string macAddr = NetworkInterface.GetAllNetworkInterfaces()[0].GetPhysicalAddress().ToString();
|
||||
//ft.SendDir("/configure", macAddr + "/NewsCrawler/" + today);
|
||||
|
||||
SendConfiguration();
|
||||
|
||||
Util.Log(Util.LOG_TYPE.VERVOSE, "매수 시작");
|
||||
}
|
||||
else
|
||||
|
||||
12596
NewsForm.resx
12596
NewsForm.resx
File diff suppressed because it is too large
Load Diff
@@ -1,662 +0,0 @@
|
||||
신한
|
||||
하이트진로홀딩스
|
||||
대원강업
|
||||
중앙에너비스
|
||||
조선내화
|
||||
대동공업
|
||||
가온전선
|
||||
삼일제약
|
||||
CS홀딩스
|
||||
천일고속
|
||||
LS네트웍스
|
||||
유수홀딩스
|
||||
이화산업
|
||||
화천기공
|
||||
유니온
|
||||
전방
|
||||
한국주철관
|
||||
대한방직
|
||||
만호제강
|
||||
국보
|
||||
금호전기
|
||||
남광토건
|
||||
부국증권
|
||||
골든브릿지증권
|
||||
태원물산
|
||||
BYC
|
||||
동일방직
|
||||
조비
|
||||
제일연마
|
||||
신화실업
|
||||
무림SP
|
||||
삼호
|
||||
한국유리
|
||||
남영비비안
|
||||
도화엔지니어링
|
||||
수출포장
|
||||
한일철강
|
||||
알보젠코리아
|
||||
삼일기업공사
|
||||
한국제지
|
||||
범양건영
|
||||
세기상사
|
||||
조흥
|
||||
한탑
|
||||
동일제강
|
||||
TCC동양
|
||||
보락
|
||||
미원상사
|
||||
유성기업
|
||||
성보화학
|
||||
일성신약
|
||||
한국화장품제조
|
||||
한진중공업홀딩스
|
||||
방림
|
||||
한성기업
|
||||
진양산업
|
||||
에이스침대
|
||||
대한화섬
|
||||
사조대림
|
||||
신흥
|
||||
고려개발
|
||||
NPC
|
||||
삼화왕관
|
||||
한국가구
|
||||
조광피혁
|
||||
DRB동일
|
||||
신라교역
|
||||
휴스틸
|
||||
푸드웰
|
||||
신영와코루
|
||||
원림
|
||||
삼아알미늄
|
||||
피제이전자
|
||||
대구백화점
|
||||
현대시멘트
|
||||
대림통상
|
||||
대양제지
|
||||
삼성공조
|
||||
신송홀딩스
|
||||
태경화학
|
||||
푸른저축은행
|
||||
샘표
|
||||
동방아그로
|
||||
한일화학
|
||||
태평양물산
|
||||
도레이케미칼
|
||||
대동전자
|
||||
이건산업
|
||||
원풍
|
||||
부스타
|
||||
일정실업
|
||||
율촌화학
|
||||
행남생활건강
|
||||
대동기어
|
||||
금비
|
||||
KCTC
|
||||
경인전자
|
||||
SIMPAC
|
||||
한솔로지스틱스
|
||||
대양금속
|
||||
무림페이퍼
|
||||
삼보산업
|
||||
삼정펄프
|
||||
엔케이물산
|
||||
영원무역홀딩스
|
||||
한국프랜지
|
||||
흥국
|
||||
오리콤
|
||||
진양폴리
|
||||
화천기계
|
||||
평화홀딩스
|
||||
두산건설
|
||||
태림포장
|
||||
성안
|
||||
유니켐
|
||||
부산산업
|
||||
STX
|
||||
영흥철강
|
||||
경동인베스트
|
||||
청호컴넷
|
||||
원일특강
|
||||
계룡건설
|
||||
까뮤이앤씨
|
||||
금강공업
|
||||
영보화학
|
||||
극동유화
|
||||
백광소재
|
||||
한라
|
||||
삼륭물산
|
||||
이스타코
|
||||
부산가스
|
||||
태경산업
|
||||
동부제철
|
||||
신대양제지
|
||||
퍼시스
|
||||
카스
|
||||
서울가스
|
||||
삼현철강
|
||||
진로발효
|
||||
조일알미늄
|
||||
동원금속
|
||||
우진비앤지
|
||||
그랜드백화점
|
||||
티에이치엔
|
||||
세아특수강
|
||||
일지테크
|
||||
글로본
|
||||
다우인큐브
|
||||
대동금속
|
||||
대호피앤씨
|
||||
세원정공
|
||||
메이슨캐피탈
|
||||
삼원강재
|
||||
아이이
|
||||
동남합성
|
||||
CNH
|
||||
동일철강
|
||||
인팩
|
||||
아트라스BX
|
||||
흥구석유
|
||||
WISCOM
|
||||
디씨엠
|
||||
KB오토시스
|
||||
세원물산
|
||||
케이피에프
|
||||
경창산업
|
||||
PN풍년
|
||||
KPX케미칼
|
||||
SJM홀딩스
|
||||
신라에스지
|
||||
한국주강
|
||||
동신건설
|
||||
특수건설
|
||||
광진실업
|
||||
부국철강
|
||||
세하
|
||||
휴맥스홀딩스
|
||||
동원수산
|
||||
C&S자산관리
|
||||
삼일
|
||||
롯데관광개발
|
||||
피델릭스
|
||||
판타지오
|
||||
GMR 머티리얼즈
|
||||
원익
|
||||
동일기연
|
||||
제이엠아이
|
||||
모아텍
|
||||
체시스
|
||||
디케이디앤아이
|
||||
디에스티
|
||||
티비씨
|
||||
인천도시가스
|
||||
해성산업
|
||||
한국기업평가
|
||||
지투알
|
||||
SCI평가정보
|
||||
대성미생물
|
||||
영풍정밀
|
||||
KCI
|
||||
심텍홀딩스
|
||||
파세코
|
||||
YG PLUS
|
||||
우리조명
|
||||
광주신세계
|
||||
제일테크노스
|
||||
리젠
|
||||
레드캡투어
|
||||
삼표시멘트
|
||||
골드퍼시픽
|
||||
이건홀딩스
|
||||
경남스틸
|
||||
화성밸브
|
||||
위노바
|
||||
오로라
|
||||
나노엔텍
|
||||
YTN
|
||||
정상제이엘에스
|
||||
상신브레이크
|
||||
대우조선해양
|
||||
에임하이
|
||||
서울리거
|
||||
성우테크론
|
||||
동부라이텍
|
||||
코아시아홀딩스
|
||||
코메론
|
||||
승일
|
||||
에스아이티글로벌
|
||||
에스폴리텍
|
||||
수산아이앤티
|
||||
썬코어
|
||||
피씨디렉트
|
||||
YW
|
||||
진양화학
|
||||
큐로홀딩스
|
||||
iMBC
|
||||
한네트
|
||||
KMH하이텍
|
||||
세동
|
||||
금강철강
|
||||
현진소재
|
||||
오상자이엘
|
||||
케이피티
|
||||
아이디스홀딩스
|
||||
유신
|
||||
와이비엠넷
|
||||
KNN
|
||||
세아홀딩스
|
||||
동아에스텍
|
||||
이그잭스
|
||||
3S
|
||||
동양에스텍
|
||||
국일신동
|
||||
한진피앤씨
|
||||
에프엔씨애드컬쳐
|
||||
인텍플러스
|
||||
MP그룹
|
||||
오리엔트정공
|
||||
전파기지국
|
||||
녹원씨아이
|
||||
우주일렉트로
|
||||
대진디엠피
|
||||
CS
|
||||
이씨에스
|
||||
멀티캠퍼스
|
||||
엔브이에이치코리
|
||||
로지시스
|
||||
세진티에스
|
||||
세이브존I&C
|
||||
이글루시큐리티
|
||||
팬엔터테인먼트
|
||||
디지털대성
|
||||
대호에이엘
|
||||
라이트론
|
||||
아이에스이커머스
|
||||
한솔시큐어
|
||||
하이스틸
|
||||
대유위니아
|
||||
코아스
|
||||
유엔젤
|
||||
네오디안테크놀로
|
||||
메가스터디
|
||||
케이에스피
|
||||
디비케이
|
||||
에프알텍
|
||||
에이티테크놀러지
|
||||
플랜티넷
|
||||
새론오토모티브
|
||||
한컴지엠디
|
||||
텔코웨어
|
||||
이베스트투자증권
|
||||
한양디지텍
|
||||
와토스코리아
|
||||
사조해표
|
||||
동양이엔피
|
||||
루미마이크로
|
||||
우리이티아이
|
||||
비츠로셀
|
||||
동북아12호
|
||||
동북아13호
|
||||
동양고속
|
||||
알티캐스트
|
||||
네오티스
|
||||
바이오톡스텍
|
||||
화신테크
|
||||
스틸플라워
|
||||
픽셀플러스
|
||||
진도
|
||||
제이티
|
||||
고려반도체
|
||||
SIMPAC Metal
|
||||
연이정보통신
|
||||
TIGER KRX100
|
||||
TIGER 은행
|
||||
텔레필드
|
||||
이크레더블
|
||||
KPX홀딩스
|
||||
기신정기
|
||||
케이아이엔엑스
|
||||
맵스리얼티1
|
||||
일진파워
|
||||
슈프리마에이치큐
|
||||
코닉글로리
|
||||
베트남개발1
|
||||
알에프세미
|
||||
제이스테판
|
||||
엘디티
|
||||
TREX 중소형가치
|
||||
TIGER 방송통신
|
||||
에스티오
|
||||
KODEX China H
|
||||
하나니켈1호
|
||||
동방선기
|
||||
ITX엠투엠
|
||||
KOSEF KRX100
|
||||
KODEX 일본TOPIX1
|
||||
한국정밀기계
|
||||
조이맥스
|
||||
인화정공
|
||||
해덕파워웨이
|
||||
KODEX 기계장비
|
||||
에스앤더블류
|
||||
NHN벅스
|
||||
동양피엔에프
|
||||
KOSEF 블루칩
|
||||
KOSEF 고배당
|
||||
TIGER 라틴35
|
||||
케이엔더블유
|
||||
디케이락
|
||||
KBSTAR 5대그룹주
|
||||
대양전기공업
|
||||
KINDEX 삼성그룹
|
||||
TREX 200
|
||||
동일금속
|
||||
KBSTAR 국고채3년
|
||||
웰크론강원
|
||||
KODEX 국고채3년
|
||||
KPX생명과학
|
||||
KINDEX 중기국고
|
||||
KOSEF 국고채3년
|
||||
우노앤컴퍼니
|
||||
TIGER 국채3년
|
||||
인포바인
|
||||
우리넷
|
||||
스타플렉스
|
||||
대성에너지
|
||||
알파홀딩스
|
||||
TIGER 차이나항셍
|
||||
조선선재
|
||||
대정화금
|
||||
에스디시스템
|
||||
옵토팩
|
||||
SJM
|
||||
화신정공
|
||||
디엔에이링크
|
||||
피제이메탈
|
||||
대성산업
|
||||
인터지스
|
||||
GH신소재
|
||||
액트
|
||||
KINDEX 삼성그룹
|
||||
TIGER 미국나스닥
|
||||
화인베스틸
|
||||
이퓨쳐
|
||||
미원화학
|
||||
팀스
|
||||
KBSTAR 중기우량
|
||||
TIGER 농산물선물
|
||||
마이다스 200커버
|
||||
제이씨케미칼
|
||||
TIGER 삼성그룹펀
|
||||
TIGER LG그룹+펀
|
||||
TIGER 현대차그룹
|
||||
나이벡
|
||||
KODEX 구리선물(H
|
||||
KODEX 콩선물(H)
|
||||
TIGER 200 건설
|
||||
TIGER 200 중공업
|
||||
TIGER 200 철강소
|
||||
TIGER 200 경기소
|
||||
TIGER 금속선물(H
|
||||
TIGER 금은선물(H
|
||||
KOSEF 미국달러선
|
||||
넥스트리밍
|
||||
KBSTAR 수출주
|
||||
KBSTAR 우량업종
|
||||
KODEX 보험
|
||||
KODEX 운송
|
||||
트러스제7호
|
||||
에이리츠
|
||||
파워 코스피100
|
||||
포티스
|
||||
ARIRANG 코스피10
|
||||
녹십자엠에스
|
||||
아이디스
|
||||
TIGER 미국S&P500
|
||||
KODEX 은선물(H)
|
||||
KINDEX 인버스
|
||||
TREX 펀더멘탈 20
|
||||
TIGER 모멘텀
|
||||
KOSEF 국고채10년
|
||||
파수닷컴
|
||||
TIGER 생활필수품
|
||||
KOSEF 200 선물
|
||||
KODEX 국채선물10
|
||||
KINDEX 레버리지
|
||||
한국ANKOR유전
|
||||
KOSEF 코스피100
|
||||
하이골드3호
|
||||
우리이앤엘
|
||||
바다로19호
|
||||
KODEX KOREA MSCI
|
||||
TIGER 소프트웨어
|
||||
TIGER 자동차
|
||||
TIGER 화학
|
||||
하이골드8호
|
||||
마이티 코스피100
|
||||
TIGER 구리실물
|
||||
ARIRANG 경기방어
|
||||
ARIRANG 경기주도
|
||||
TIGER 200커버드
|
||||
KOSEF 국고채10년
|
||||
KTOP 코스피50
|
||||
한국패러랠
|
||||
현대공업
|
||||
TIGER 베타플러스
|
||||
램테크놀러지
|
||||
하이골드12호
|
||||
에프엔씨엔터
|
||||
TIGER 로우볼
|
||||
장원테크
|
||||
파워 중기국고채
|
||||
KODEX 국채선물10
|
||||
KINDEX 미국다우
|
||||
TIGER 미국MSCI리
|
||||
KBSTAR 채권혼합
|
||||
KBSTAR 주식혼합
|
||||
KODEX 미국S&P바
|
||||
ARIRANG 글로벌MS
|
||||
포시에스
|
||||
서전기전
|
||||
ARIRANG 바벨 채
|
||||
KINDEX 단기통안
|
||||
육일씨엔에쓰
|
||||
파워 고배당저변
|
||||
TIGER 일본TOPIX(
|
||||
TIGER 유로스탁스
|
||||
ARIRANG 선진국MS
|
||||
KINDEX 일본TOPIX
|
||||
KBSTAR 일본TOPIX
|
||||
고려시멘트
|
||||
KODEX 미국S&P IT
|
||||
KODEX 미국S&P산
|
||||
KODEX 미국S&P금
|
||||
KODEX 독일MSCI(
|
||||
유니온커뮤니티
|
||||
TIGER 미국나스닥
|
||||
모두투어리츠
|
||||
ARIRANG 차이나H
|
||||
화이브라더스코리
|
||||
KINDEX 일본TOPIX
|
||||
엔터메이트
|
||||
골든브릿지제2호
|
||||
SK1호스팩
|
||||
셀바스헬스케어
|
||||
SMART 선진국MSCI
|
||||
TIGER 코스피고배
|
||||
마이티 코스피고
|
||||
KINDEX 배당성장
|
||||
AP위성
|
||||
TIGER 배당성장
|
||||
KODEX 배당성장
|
||||
KODEX 삼성그룹밸
|
||||
ARIRANG 미국다우
|
||||
세미콘라이트
|
||||
유진에이씨피씨스
|
||||
메가스터디교육
|
||||
우정비에스씨
|
||||
흥국 S&P코리아로
|
||||
미래에셋제3호스
|
||||
이노인스트루먼트
|
||||
하이제3호스팩
|
||||
TIGER 가격조정
|
||||
엔에이치스팩7호
|
||||
KODEX 미국S&P에
|
||||
키움스팩3호
|
||||
KBSTAR 미국S&P원
|
||||
KODEX 미국S&P500
|
||||
골든브릿지제3호
|
||||
한화에이스스팩2
|
||||
KINDEX 중국본토C
|
||||
유안타제2호스팩
|
||||
SMART 중국본토
|
||||
유진스팩3호
|
||||
한솔씨앤피
|
||||
케이비드림3호스
|
||||
케이디켐
|
||||
ARIRANG S&P한국
|
||||
ARIRANG 스마트베
|
||||
ARIRANG 스마트베
|
||||
ARIRANG 스마트베
|
||||
케이비제8호스팩
|
||||
교보5호스팩
|
||||
TIGER 미국S&P500
|
||||
TIGER 미국S&P500
|
||||
TIGER 유로스탁스
|
||||
TIGER 이머징마켓
|
||||
IBKS제3호스팩
|
||||
이베스트스팩3호
|
||||
신영스팩2호
|
||||
쿠첸
|
||||
에이치엠씨3호스
|
||||
케이비드림4호스
|
||||
KINDEX 한류
|
||||
동부스팩3호
|
||||
파워 단기채
|
||||
키움스팩4호
|
||||
KODEX 200 중소형
|
||||
TIGER 200 산업재
|
||||
TIGER 200 생활소
|
||||
TIGER 우량가치
|
||||
골든브릿지제4호
|
||||
TIGER 여행레저
|
||||
TIGER 미디어컨텐
|
||||
TIGER KTOP30
|
||||
KODEX KTOP30
|
||||
하나금융7호스팩
|
||||
에코마케팅
|
||||
동부제4호스팩
|
||||
케이비제9호스팩
|
||||
SK3호스팩
|
||||
KBSTAR V&S셀렉트
|
||||
하이에이아이1호
|
||||
ARIRANG 스마트베
|
||||
KODEX 배당성장채
|
||||
TIGER 경기방어채
|
||||
피앤씨테크
|
||||
로고스바이오
|
||||
ARIRANG 스마트베
|
||||
KINDEX 일본Nikke
|
||||
미래에셋제5호스
|
||||
에이치엘사이언스
|
||||
ARIRANG 우량회사
|
||||
한국4호스팩
|
||||
TIGER 일본니케이
|
||||
KBSTAR V&S셀렉트
|
||||
교보비엔케이스팩
|
||||
KODEX 모멘텀Plus
|
||||
KODEX 퀄리티Plus
|
||||
KODEX 밸류Plus
|
||||
ARIRANG 스마트베
|
||||
TIGER 미국다우존
|
||||
TIGER 유로스탁스
|
||||
TIGER 차이나HSCE
|
||||
KODEX 가치투자
|
||||
KODEX 성장투자
|
||||
KODEX 턴어라운드
|
||||
TIGER 일본TOPIX
|
||||
TIGER S&P글로벌
|
||||
KBSTAR 차이나H주
|
||||
케이비제10호스팩
|
||||
KODEX 선진국MSCI
|
||||
ARIRANG 고배당저
|
||||
ARIRANG 고배당주
|
||||
KINDEX 코스닥(합
|
||||
TIGER 200동일가
|
||||
KBSTAR 200선물인
|
||||
KODEX 200동일가
|
||||
KBSTAR 모멘텀밸
|
||||
KBSTAR 모멘텀로
|
||||
ARIRANG 200선물
|
||||
ARIRANG 200선물
|
||||
KOSEF 200선물인
|
||||
KOSEF 200선물인
|
||||
KBSTAR 헬스케어
|
||||
KBSTAR 헬스케어
|
||||
TIGER 대만TAIEX
|
||||
IBKS제5호스팩
|
||||
KINDEX 인도네시
|
||||
ARIRANG 심천차이
|
||||
엔에이치스팩10호
|
||||
ARIRANG 미국S&P5
|
||||
ARIRANG S&P글로
|
||||
하나금융10호스팩
|
||||
한국제5호스팩
|
||||
KODEX 3대농산물
|
||||
KODEX WTI원유선
|
||||
KODEX S&P글로벌
|
||||
KBSTAR 미국장기
|
||||
교보7호스팩
|
||||
TIGER 코스닥150
|
||||
KBSTAR 미국장기
|
||||
TIGER S&P글로벌
|
||||
KBSTAR 미국장기
|
||||
KBSTAR 미국장기
|
||||
KINDEX 스마트모
|
||||
TIGER 코스피
|
||||
TIGER 글로벌자원
|
||||
파워 스마트밸류
|
||||
TIGER 코스피대형
|
||||
완리
|
||||
ARIRANG ESG우수
|
||||
TIGER 코스피중형
|
||||
KODEX MSCI퀄리티
|
||||
KINDEX 중장기국
|
||||
KBSTAR 중장기국
|
||||
KINDEX 스마트밸
|
||||
엔에이치스팩12호
|
||||
KODEX MSCI모멘텀
|
||||
KODEX 단기변동금
|
||||
KODEX 종합채권(A
|
||||
ARIRANG 중형주저
|
||||
TIGER 미국달러선
|
||||
TIGER 코스닥150
|
||||
TIGER 미국달러선
|
||||
KODEX 미국달러선
|
||||
하나금융9호스팩
|
||||
TIGER 우선주
|
||||
TIGER 코스닥150I
|
||||
케이피에스
|
||||
엔에이치스팩11호
|
||||
KODEX 심천ChiNex
|
||||
신한제3호스팩
|
||||
KOSEF 저PBR가중
|
||||
KOSEF 배당바이백
|
||||
케이비제11호스팩
|
||||
KODEX 미국달러선
|
||||
KBSTAR 고배당
|
||||
TIGER 지속배당
|
||||
한화수성스팩
|
||||
KODEX IT소프트웨
|
||||
KODEX 헬스케어
|
||||
KODEX 필수소비재
|
||||
KODEX 경기소비재
|
||||
KINDEX 러시아MSC
|
||||
대신밸런스제4호
|
||||
KINDEX 필리핀MSC
|
||||
KODEX 미국달러선
|
||||
신영스팩3호
|
||||
미래에셋대우스팩
|
||||
IBKS제6호스팩
|
||||
한화에이스스팩3
|
||||
|
||||
@@ -1,6 +1 @@
|
||||
LG생활건강
|
||||
삼성전자우
|
||||
롯데칠성
|
||||
삼성전자
|
||||
태광산업
|
||||
영풍
|
||||
|
||||
@@ -1,354 +1,301 @@
|
||||
현대重 = 현대중공업
|
||||
셀트리온 = 셀트리온제약
|
||||
사람인 = 사람인에이치알
|
||||
아가방 = 아가방컴퍼니
|
||||
에이티넘 = 에이티넘인베스트
|
||||
크린앤 = 크린앤사이언스
|
||||
코아시아 = 코아시아홀딩스
|
||||
썬테크놀로지스 = 썬텍
|
||||
위젠솔라 = 뉴프라이드
|
||||
한토신 = 한국토지신탁
|
||||
테바 = 한독
|
||||
신성FA = 신성에프에이
|
||||
무림에스피 = 무림SP
|
||||
SK이노 = SK이노베이션
|
||||
디지털옵틱 = 디지탈옵틱
|
||||
동아제약 = 동아쏘시오홀딩스
|
||||
시공미디어 = 시공테크
|
||||
신성솔라 = 신성솔라에너지
|
||||
NH투자證 = NH투자증권
|
||||
에스케이 머티리얼즈 = SK머티리얼즈
|
||||
우진엔지니어링 = 우진이엔지
|
||||
두산重 = 두산중공업
|
||||
삼천당 = 삼천당제약
|
||||
케이탑자기관리부동산투자회사 = 케이탑리츠
|
||||
세이브존아이앤씨 = 세이브존I&C
|
||||
신한은행 = 신한지주
|
||||
국민은행 = KB금융
|
||||
유진그룹 = 유진기업
|
||||
국민銀 = KB금융
|
||||
부산銀 = BNK금융지주
|
||||
BNK = BNK금융지주
|
||||
우리銀 = 우리은행
|
||||
삼성 SDS = 삼성에스디에스
|
||||
삼성SDS = 삼성에스디에스
|
||||
동부證 = 동부증권
|
||||
대신證 = 대신증권
|
||||
유안타證 = 유안타증권
|
||||
키움證 = 키움증권
|
||||
유진투자證 = 유진투자증권
|
||||
메리츠 = 메리츠종금증권
|
||||
휠라 = 휠라코리아
|
||||
에스엔케이폴리텍 = S&K폴리텍
|
||||
신영證 = 신영증권
|
||||
영원아웃도어 = 영원무역홀딩스
|
||||
삼성 SDS = 삼성에스디에스
|
||||
삼성SDS = 삼성에스디에스
|
||||
아시아나 = 아시아나항공
|
||||
LG생건 = LG생활건강
|
||||
동아ST = 동아에스티
|
||||
에브리온TV = 현대에이치씨엔
|
||||
현대HCN = 현대에이치씨엔
|
||||
엔케이맥스 = 에이티젠
|
||||
신한銀 = 신한지주
|
||||
한국證 = 한국금융지주
|
||||
한국투자증권 = 한국금융지주
|
||||
한국투자證 = 한국금융지주
|
||||
두산인프라 = 두산인프라코어
|
||||
두산밥캣 = 두산인프라코어
|
||||
NHN엔터 = NHN엔터테인먼트
|
||||
한컴 = 한글과컴퓨터
|
||||
LIS = 엘아이에스
|
||||
티피씨메카트로닉스 = TPC
|
||||
한국석유공업 = 한국석유
|
||||
이지 = EG
|
||||
유콘시스템 = 퍼스텍
|
||||
로킷 = 씨티엘
|
||||
미원스페셜티케미칼 = 미원에스씨
|
||||
토탈소프트뱅크 = 토탈소프트
|
||||
바이오스타 = 네이처셀
|
||||
젬백스테크 = 젬백스테크놀러지
|
||||
LGD = LG디스플레이
|
||||
엔씨 = 엔씨소프트
|
||||
스마젠 = 큐로컴
|
||||
티피씨 = 티피씨글로벌
|
||||
한국테크 = 한국테크놀로지
|
||||
KEB하나銀 = 하나금융지주
|
||||
서울도시가스 = 서울가스
|
||||
유진투자 = 유진투자증권
|
||||
중국원양자원유한공사 = 중국원양자원
|
||||
KB국민은행 = KB금융
|
||||
제이씨현 = 제이씨현시스템
|
||||
동양물산기업 = 동양물산
|
||||
삼화페인트공업 = 삼화페인트
|
||||
씨그널엔터그룹 = 씨그널엔터테인먼트그룹
|
||||
씨그널엔터 = 씨그널엔터테인먼트그룹
|
||||
씨그널엔터테인먼트 = 씨그널엔터테인먼트그룹
|
||||
에스엔유프리시젼 = 에스엔유
|
||||
에스지에이 = SGA
|
||||
케이티스카이라이프 = 스카이라이프
|
||||
이엠따블유 = EMW
|
||||
에임하이글로벌 = 에임하이
|
||||
LGU+= LG유플러스
|
||||
LGU+ = LG유플러스
|
||||
네이버 = NAVER
|
||||
케이지이니시스 = KG이니시스
|
||||
나이스평가정보 = NICE평가정보
|
||||
아이에이치큐 = IHQ
|
||||
티브로드 = 태광
|
||||
다음 = 카카오
|
||||
현대重 = 현대중공업
|
||||
현대車 = 현대차
|
||||
로엔엔터테인먼트 = 로엔
|
||||
YG엔터 = 와이지엔터테인먼트
|
||||
YG = 와이지엔터테인먼트
|
||||
엔에이치투자증권 = NH투자증권
|
||||
NH투자 = NH투자증권
|
||||
롯데마트 = 롯데쇼핑
|
||||
GS샵 = GS홈쇼핑
|
||||
LG유플 = LG유플러스
|
||||
대우조선 = 대우조선해양
|
||||
에이블씨앤씨 = 에이블씨엔씨
|
||||
SKT = SK텔레콤
|
||||
우진비앤비 = 우진비앤지
|
||||
삼성엔지 = 삼성엔지니어링
|
||||
에스에프티 = 에프에스티
|
||||
네오위즈 = 네오위즈게임즈
|
||||
에스케이씨코오롱피아이 = SKC코오롱PI
|
||||
싸이월드 = SK컴즈
|
||||
포스코 = POSCO
|
||||
포미닛 = 큐브엔터
|
||||
대림 = 대림산업
|
||||
메리츠화재해상보험 = 메리츠화재
|
||||
씨제이대한통운 = CJ대한통운
|
||||
기아자동차 = 기아차
|
||||
삼화페인트공업 = 삼화페인트
|
||||
에스케이하이닉스 = SK하이닉스
|
||||
삼성화재해상보험 = 삼성화재
|
||||
한국주철관공업 = 한국주철관
|
||||
지에스글로벌 = GS글로벌
|
||||
골든브릿지투자증권 = 골든브릿지증권
|
||||
현대해상화재보험 = 현대해상
|
||||
에이치엠씨투자증권 = HMC투자증권
|
||||
삼화콘덴서공업 = 삼화콘덴서
|
||||
케이씨씨 = KCC
|
||||
국제약품공업 = 국제약품
|
||||
아모레퍼시픽그룹 = 아모레G
|
||||
동양물산기업 = 동양물산
|
||||
쌍용양회공업 = 쌍용양회
|
||||
영진약품공업 = 영진약품
|
||||
아이에이치큐 = IHQ
|
||||
쌍용자동차 = 쌍용차
|
||||
코리안리재보험 = 코리안리
|
||||
태양금속공업 = 태양금속
|
||||
서울식품공업 = 서울식품
|
||||
디알비동일 = DRB동일
|
||||
롯데칠성음료 = 롯데칠성
|
||||
현대자동차 = 현대차
|
||||
포스코 = POSCO
|
||||
삼영전자공업 = 삼영전자
|
||||
대림비앤코 = 대림B&Co
|
||||
동부화재해상보험 = 동부화재
|
||||
휴니드테크놀러지스 = 휴니드
|
||||
엔에이치투자증권 = NH투자증권
|
||||
화승인더스트리 = 화승인더
|
||||
지에스건설 = GS건설
|
||||
서부티엔디 = 서부T&D
|
||||
지에스리테일 = GS리테일
|
||||
동아타이어공업 = 동아타이어
|
||||
부-스타 = 부스타
|
||||
메리츠종합금융증권 = 메리츠종금증권
|
||||
대우전자부품 = 대우부품
|
||||
케이씨그린홀딩스 = KC그린홀딩스
|
||||
무림피앤피 = 무림P&P
|
||||
우리종합금융 = 우리종금
|
||||
한솔피엔에스 = 한솔PNS
|
||||
엘지이노텍 = LG이노텍
|
||||
형지아이앤씨 = 형지I&C
|
||||
태림포장공업 = 태림포장
|
||||
현대종합상사 = 현대상사
|
||||
금호석유화학 = 금호석유
|
||||
경동도시가스 = 경동가스
|
||||
현대산업개발 = 현대산업
|
||||
아가방앤컴퍼니 = 아가방컴퍼니
|
||||
대경기계기술 = 대경기계
|
||||
한국전력공사 = 한국전력
|
||||
로엔엔터테인먼트 = 로엔
|
||||
큐캐피탈파트너스 = 큐캐피탈
|
||||
세명전기공업 = 세명전기
|
||||
현대엘리 = 현대엘리베이
|
||||
현대엘리베이터 = 현대엘리베이
|
||||
현대百 = 현대백화점
|
||||
한국알콜산업 = 한국알콜
|
||||
하이트론씨스템즈 = 하이트론
|
||||
에스비아이인베스트먼트 = SBI인베스트먼트
|
||||
일진디스플레이 = 일진디스플
|
||||
에이티넘인베스트먼트 = 에이티넘인베스트
|
||||
케이씨씨건설 = KCC건설
|
||||
제일제강공업 = 제일제강
|
||||
아트라스비엑스 = 아트라스BX
|
||||
대한약품공업 = 대한약품
|
||||
중소기업은행 = 기업은행
|
||||
한국단자공업 = 한국단자
|
||||
코리아나화장품 = 코리아나
|
||||
비지에프리테일 = BGF리테일
|
||||
대성창업투자 = 대성창투
|
||||
지에스홈쇼핑 = GS홈쇼핑
|
||||
나이스평가정보 = NICE평가정보
|
||||
케이티 = KT
|
||||
케이티비투자증권 = KTB투자증권
|
||||
원익아이피에스 = 원익IPS
|
||||
씨앤에스자산관리 = C&S자산관리
|
||||
아즈텍더블유비이 = 아즈텍WB
|
||||
아즈텍 = 아즈텍WB
|
||||
티제이미디어 = TJ미디어
|
||||
삼성생명보험 = 삼성생명
|
||||
디지틀조선일보 = 디지틀조선
|
||||
한국유나이티드제약 = 유나이티드제약
|
||||
케이티앤지 = KT&G
|
||||
엘지디스플레이 = LG디스플레이
|
||||
NICE홀딩스 = NICE
|
||||
네이버 = NAVER
|
||||
케이지이니시스 = KG이니시스
|
||||
씨제이오쇼핑 = CJ오쇼핑
|
||||
케이티하이텔 = KTH
|
||||
대성미생물연구소 = 대성미생물
|
||||
에이치알에스 = HRS
|
||||
케이씨아이 = KCI
|
||||
인지디스플레이 = 인지디스플레
|
||||
씨제이헬로비전 = CJ헬로비전
|
||||
서린바이오사이언스 = 서린바이오
|
||||
에스넷시스템 = 에스넷
|
||||
한국경제티브이 = 한국경제TV
|
||||
오로라월드 = 오로라
|
||||
에스지엔지 = SG&G
|
||||
솔고바이오메디칼 = 솔고바이오
|
||||
에임하이글로벌 = 에임하이
|
||||
케이티뮤직 = KT뮤직
|
||||
조광아이엘아이 = 조광ILI
|
||||
에스비에스콘텐츠허브 = SBS콘텐츠허브
|
||||
백금티앤에이 = 백금T&A
|
||||
케이지모빌리언스 = KG모빌리언스
|
||||
한국항공우주산업 = 한국항공우주
|
||||
초록뱀미디어 = 초록뱀
|
||||
인트론바이오테크놀로지 = 인트론바이오
|
||||
에스지에이 = SGA
|
||||
엠.피.씨 = 엠피씨
|
||||
씨제이프레시웨이 = CJ프레시웨이
|
||||
아이엠비씨 = iMBC
|
||||
한국전력기술 = 한전기술
|
||||
아이앤씨테크놀로지 = 아이앤씨
|
||||
케이티스카이라이프 = 스카이라이프
|
||||
예스이십사 = 예스24
|
||||
한미글로벌건축사사무소 = 한미글로벌
|
||||
에이피시스템 = AP시스템
|
||||
신한금융지주회사 = 신한지주
|
||||
아리온테크놀로지 = 아리온
|
||||
케이티씨에스 = KTcs
|
||||
KTCS = KTcs
|
||||
KT CS = KTcs
|
||||
삼에스코리아 = 3S
|
||||
케이티서브마린 = KT서브마린
|
||||
케이에이치바텍 = KH바텍
|
||||
엠피케이그룹 = MPK
|
||||
넥스트비티 = 넥스트BT
|
||||
메디프론디비티 = 메디프론
|
||||
우주일렉트로닉스 = 우주일렉트로
|
||||
씨에스 = CS
|
||||
에스케이커뮤니케이션즈 = SK컴즈
|
||||
디스플레이테크 = 디스플레이텍
|
||||
씨씨에스충북방송 = 씨씨에스
|
||||
아프리카티비 = 아프리카TV
|
||||
일신바이오베이스 = 일신바이오
|
||||
에이제이렌터카 = AJ렌터카
|
||||
디엠에스 = DMS
|
||||
한국투자금융지주 = 한국금융지주
|
||||
한국지역난방공사 = 지역난방공사
|
||||
중앙백신연구소 = 중앙백신
|
||||
원익큐엔씨 = 원익QnC
|
||||
에이치비테크놀러지 = HB테크놀러지
|
||||
아이오케이컴퍼니 = 아이오케이
|
||||
이엠따블유 = EMW
|
||||
엘아이지넥스원 = LIG넥스원
|
||||
에스엔유프리시젼 = 에스엔유
|
||||
모두투어네트워크 = 모두투어
|
||||
일진다이아몬드 = 일진다이아
|
||||
젬백스&카엘 = 젬백스
|
||||
동양생명보험 = 동양생명
|
||||
글로벌스탠다드테크놀로지 = GST
|
||||
비에이치아이주식회사 = 비에이치아이
|
||||
크리스탈지노믹스 = 크리스탈
|
||||
미래에셋생명보험 = 미래에셋생명
|
||||
MDS테크놀로지 = MDS테크
|
||||
한화생명보험 = 한화생명
|
||||
한화손보 = 한화손해보험
|
||||
에이스테크놀로지 = 에이스테크
|
||||
맥쿼리한국인프라투융자회사 = 맥쿼리인프라
|
||||
케이이씨 = KEC
|
||||
한라아이엠에스 = 한라IMS
|
||||
효성아이티엑스 = 효성ITX
|
||||
웨이브일렉트로닉스 = 웨이브일렉트로
|
||||
아이에스시 = ISC
|
||||
주식회사에스코넥 = 에스코넥
|
||||
마이크로컨텍솔루션 = 마이크로컨텍솔
|
||||
고영테크놀러지 = 고영
|
||||
에스디엔 = SDN
|
||||
주식회사쎄트렉아이 = 쎄트렉아이
|
||||
한솔신텍주식회사 = 한솔신텍
|
||||
동국에스엔씨 = 동국S&C
|
||||
KB금융지주 = KB금융
|
||||
KB = KB금융
|
||||
엘지하우시스 = LG하우시스
|
||||
케이지피 = KGP
|
||||
위메이드엔터테인먼트 = 위메이드
|
||||
그랜드코리아레저 = GKL
|
||||
케이피엑스라이프사이언스 = KPX생명과학
|
||||
씨유메디칼시스템 = 씨유메디칼
|
||||
이미지스테크놀로지 = 이미지스
|
||||
케이씨코트렐 = KC코트렐
|
||||
코오롱인더스트리 = 코오롱인더
|
||||
케이엠에이치 = KMH
|
||||
에스제이엠 = SJM
|
||||
한전산업개발 = 한전산업
|
||||
엠비케이 = MBK
|
||||
넥스트엔터테인먼트월드 = NEW
|
||||
에프엔씨엔터테인먼트 = 에프엔씨엔터
|
||||
에스케이씨코오롱피아이 = SKC코오롱PI
|
||||
엔에이치엔엔터테인먼트 = NHN엔터테인먼트
|
||||
큐브엔터테인먼트 = 큐브엔터
|
||||
차이나그레이트스타인터내셔널리미티드 = 차이나그레이트
|
||||
중국원양자원유한공사 = 중국원양자원
|
||||
에스앤씨엔진그룹리미티드 = 에스앤씨엔진그룹
|
||||
차이나하오란리사이클링유한공사 = 차이나하오란
|
||||
뉴프라이드코퍼레이션 = 뉴프라이드
|
||||
이스트아시아홀딩스인베스트먼트리미티드 = 이스트아시아홀딩스
|
||||
씨케이에이치푸드앤헬스리미티드 = 씨케이에이치
|
||||
웨이포트유한공사 = 웨이포트
|
||||
완리인터내셔널홀딩스 = 완리
|
||||
부-스타 = 부스타
|
||||
와이지플러스 = YG PLUS
|
||||
YG 플러스 = YG PLUS
|
||||
YG플러스 = YG PLUS
|
||||
삼보산업 주식회사 = 삼보산업
|
||||
갤럭시아 에스엠 = 갤럭시아에스엠
|
||||
주식회사 플레이위드 = 플레이위드
|
||||
신세계아이앤씨 = 신세계 I&C
|
||||
제이와이피엔터테인먼트 = JYP Ent.
|
||||
와이지플러스 = YG PLUS
|
||||
에스.엠.엔터테인먼트 = 에스엠
|
||||
케이에스에스 해운 = KSS해운
|
||||
에스엠컬처앤콘텐츠 = SM C&C
|
||||
DK 유아이엘 = 유아이엘
|
||||
경남제약 주식회사 = 경남제약
|
||||
농업회사법인(주)농우바이오 = 농우바이오
|
||||
에스케이씨 솔믹스 = SKC 솔믹스
|
||||
SK케미컬 = SK케미칼
|
||||
SKC = SK케미칼
|
||||
주식회사 엠게임 = 엠게임
|
||||
씨제이씨지브이 = CJ CGV
|
||||
씨에스에이코스믹 = CSA 코스믹
|
||||
로코조이 인터내셔널 = 로코조이
|
||||
씨제이이앤엠 = CJ E&M
|
||||
에스지에이 솔루션즈 = SGA솔루션즈
|
||||
주식회사 타이거일렉 = 타이거일렉
|
||||
SBI인베 = SBI인베스트먼트
|
||||
지진 = 삼영엠텍
|
||||
모바일어플 = 모바일어플라이언스
|
||||
키위미디어 = 키위미디어그룹
|
||||
현대重 = 현대중공업지주
|
||||
셀트리온 = 셀트리온제약
|
||||
사람인 = 사람인에이치알
|
||||
아가방 = 아가방컴퍼니
|
||||
에이티넘 = 에이티넘인베스트
|
||||
크린앤 = 크린앤사이언스
|
||||
위젠솔라 = 뉴프라이드
|
||||
한토신 = 한국토지신탁
|
||||
테바 = 한독
|
||||
무림에스피 = 무림SP
|
||||
SK이노 = SK이노베이션
|
||||
디지털옵틱 = 디지탈옵틱
|
||||
동아제약 = 동아쏘시오홀딩스
|
||||
시공미디어 = 시공테크
|
||||
NH투자證 = NH투자증권
|
||||
에스케이 머티리얼즈 = SK머티리얼즈
|
||||
두산重 = 두산중공업
|
||||
삼천당 = 삼천당제약
|
||||
케이탑자기관리부동산투자회사 = 케이탑리츠
|
||||
세이브존아이앤씨 = 세이브존I&C
|
||||
국민은행 = KB금융
|
||||
유진그룹 = 유진기업
|
||||
국민銀 = KB금융
|
||||
부산銀 = BNK금융지주
|
||||
BNK = BNK금융지주
|
||||
우리銀 = 우리금융지주
|
||||
삼성 SDS = 삼성에스디에스
|
||||
삼성SDS = 삼성에스디에스
|
||||
대신證 = 대신증권
|
||||
유안타證 = 유안타증권
|
||||
키움證 = 키움증권
|
||||
유진투자證 = 유진투자증권
|
||||
메리츠 = 메리츠증권
|
||||
휠라 = 휠라홀딩스
|
||||
에스엔케이폴리텍 = S&K폴리텍
|
||||
신영證 = 신영증권
|
||||
영원아웃도어 = 영원무역홀딩스
|
||||
삼성 SDS = 삼성에스디에스
|
||||
삼성SDS = 삼성에스디에스
|
||||
아시아나 = 아시아나항공
|
||||
LG생건 = LG생활건강
|
||||
동아ST = 동아에스티
|
||||
한국證 = 한국금융지주
|
||||
한국투자증권 = 한국금융지주
|
||||
한국투자證 = 한국금융지주
|
||||
두산인프라 = 두산인프라코어
|
||||
두산밥캣 = 두산인프라코어
|
||||
한컴 = 한글과컴퓨터
|
||||
LIS = 엘아이에스
|
||||
티피씨메카트로닉스 = TPC
|
||||
한국석유공업 = 한국석유
|
||||
이지 = EG
|
||||
유콘시스템 = 퍼스텍
|
||||
미원스페셜티케미칼 = 미원에스씨
|
||||
토탈소프트뱅크 = 토탈소프트
|
||||
바이오스타 = 네이처셀
|
||||
LGD = LG디스플레이
|
||||
엔씨 = 엔씨소프트
|
||||
스마젠 = 큐로컴
|
||||
티피씨 = 티피씨글로벌
|
||||
한국테크 = 한국테크놀로지
|
||||
KEB하나銀 = 하나금융지주
|
||||
서울도시가스 = 서울가스
|
||||
유진투자 = 유진투자증권
|
||||
KB국민은행 = KB금융
|
||||
제이씨현 = 제이씨현시스템
|
||||
동양물산기업 = 동양물산
|
||||
삼화페인트공업 = 삼화페인트
|
||||
에스엔유프리시젼 = 에스엔유
|
||||
에스지에이 = SGA
|
||||
케이티스카이라이프 = 스카이라이프
|
||||
이엠따블유 = EMW
|
||||
LGU+= LG유플러스
|
||||
LGU+ = LG유플러스
|
||||
네이버 = NAVER
|
||||
케이지이니시스 = KG이니시스
|
||||
나이스평가정보 = NICE평가정보
|
||||
아이에이치큐 = IHQ
|
||||
티브로드 = 태광
|
||||
다음 = 카카오
|
||||
현대車 = 현대차
|
||||
YG엔터 = 와이지엔터테인먼트
|
||||
YG = 와이지엔터테인먼트
|
||||
엔에이치투자증권 = NH투자증권
|
||||
NH투자 = NH투자증권
|
||||
롯데마트 = 롯데쇼핑
|
||||
GS샵 = GS홈쇼핑
|
||||
LG유플 = LG유플러스
|
||||
대우조선 = 대우조선해양
|
||||
에이블씨앤씨 = 에이블씨엔씨
|
||||
SKT = SK텔레콤
|
||||
우진비앤비 = 우진비앤지
|
||||
삼성엔지 = 삼성엔지니어링
|
||||
에스에프티 = 에프에스티
|
||||
포스코 = POSCO
|
||||
포미닛 = 큐브엔터
|
||||
메리츠화재해상보험 = 메리츠화재
|
||||
씨제이대한통운 = CJ대한통운
|
||||
기아자동차 = 기아차
|
||||
삼화페인트공업 = 삼화페인트
|
||||
에스케이하이닉스 = SK하이닉스
|
||||
삼성화재해상보험 = 삼성화재
|
||||
한국주철관공업 = 한국주철관
|
||||
지에스글로벌 = GS글로벌
|
||||
현대해상화재보험 = 현대해상
|
||||
삼화콘덴서공업 = 삼화콘덴서
|
||||
케이씨씨 = KCC
|
||||
국제약품공업 = 국제약품
|
||||
아모레퍼시픽그룹 = 아모레G
|
||||
동양물산기업 = 동양물산
|
||||
쌍용양회공업 = 쌍용양회
|
||||
영진약품공업 = 영진약품
|
||||
아이에이치큐 = IHQ
|
||||
쌍용자동차 = 쌍용차
|
||||
코리안리재보험 = 코리안리
|
||||
태양금속공업 = 태양금속
|
||||
서울식품공업 = 서울식품
|
||||
디알비동일 = DRB동일
|
||||
롯데칠성음료 = 롯데칠성
|
||||
현대자동차 = 현대차
|
||||
포스코 = POSCO
|
||||
삼영전자공업 = 삼영전자
|
||||
대림비앤코 = 대림B&Co
|
||||
휴니드테크놀러지스 = 휴니드
|
||||
엔에이치투자증권 = NH투자증권
|
||||
화승인더스트리 = 화승인더
|
||||
지에스건설 = GS건설
|
||||
서부티엔디 = 서부T&D
|
||||
지에스리테일 = GS리테일
|
||||
동아타이어공업 = 동아타이어
|
||||
부-스타 = 부스타
|
||||
메리츠종합금융증권 = 메리츠증권
|
||||
대우전자부품 = 대우부품
|
||||
케이씨그린홀딩스 = KC그린홀딩스
|
||||
무림피앤피 = 무림P&P
|
||||
우리종합금융 = 우리종금
|
||||
한솔피엔에스 = 한솔PNS
|
||||
엘지이노텍 = LG이노텍
|
||||
형지아이앤씨 = 형지I&C
|
||||
태림포장공업 = 태림포장
|
||||
현대종합상사 = 현대상사
|
||||
금호석유화학 = 금호석유
|
||||
아가방앤컴퍼니 = 아가방컴퍼니
|
||||
한국전력공사 = 한국전력
|
||||
큐캐피탈파트너스 = 큐캐피탈
|
||||
세명전기공업 = 세명전기
|
||||
현대엘리 = 현대엘리베이
|
||||
현대엘리베이터 = 현대엘리베이
|
||||
현대百 = 현대백화점
|
||||
한국알콜산업 = 한국알콜
|
||||
하이트론씨스템즈 = 하이트론
|
||||
에스비아이인베스트먼트 = SBI인베스트먼트
|
||||
일진디스플레이 = 일진디스플
|
||||
에이티넘인베스트먼트 = 에이티넘인베스트
|
||||
케이씨씨건설 = KCC건설
|
||||
제일제강공업 = 제일제강
|
||||
대한약품공업 = 대한약품
|
||||
중소기업은행 = 기업은행
|
||||
한국단자공업 = 한국단자
|
||||
코리아나화장품 = 코리아나
|
||||
비지에프리테일 = BGF리테일
|
||||
대성창업투자 = 대성창투
|
||||
지에스홈쇼핑 = GS홈쇼핑
|
||||
나이스평가정보 = NICE평가정보
|
||||
케이티 = KT
|
||||
케이티비투자증권 = KTB투자증권
|
||||
원익아이피에스 = 원익IPS
|
||||
아즈텍더블유비이 = 아즈텍WB
|
||||
아즈텍 = 아즈텍WB
|
||||
티제이미디어 = TJ미디어
|
||||
삼성생명보험 = 삼성생명
|
||||
디지틀조선일보 = 디지틀조선
|
||||
한국유나이티드제약 = 유나이티드제약
|
||||
케이티앤지 = KT&G
|
||||
엘지디스플레이 = LG디스플레이
|
||||
NICE홀딩스 = NICE
|
||||
네이버 = NAVER
|
||||
케이지이니시스 = KG이니시스
|
||||
케이티하이텔 = KTH
|
||||
대성미생물연구소 = 대성미생물
|
||||
에이치알에스 = HRS
|
||||
케이씨아이 = KCI
|
||||
인지디스플레이 = 인지디스플레
|
||||
서린바이오사이언스 = 서린바이오
|
||||
에스넷시스템 = 에스넷
|
||||
한국경제티브이 = 한국경제TV
|
||||
오로라월드 = 오로라
|
||||
에스지엔지 = SG&G
|
||||
솔고바이오메디칼 = 솔고바이오
|
||||
조광아이엘아이 = 조광ILI
|
||||
에스비에스콘텐츠허브 = SBS콘텐츠허브
|
||||
백금티앤에이 = 백금T&A
|
||||
케이지모빌리언스 = KG모빌리언스
|
||||
한국항공우주산업 = 한국항공우주
|
||||
초록뱀미디어 = 초록뱀
|
||||
인트론바이오테크놀로지 = 인트론바이오
|
||||
에스지에이 = SGA
|
||||
씨제이프레시웨이 = CJ프레시웨이
|
||||
아이엠비씨 = iMBC
|
||||
한국전력기술 = 한전기술
|
||||
아이앤씨테크놀로지 = 아이앤씨
|
||||
케이티스카이라이프 = 스카이라이프
|
||||
예스이십사 = 예스24
|
||||
한미글로벌건축사사무소 = 한미글로벌
|
||||
에이피시스템 = AP시스템
|
||||
아리온테크놀로지 = 아리온
|
||||
케이티씨에스 = KTcs
|
||||
KTCS = KTcs
|
||||
KT CS = KTcs
|
||||
삼에스코리아 = 3S
|
||||
케이티서브마린 = KT서브마린
|
||||
케이에이치바텍 = KH바텍
|
||||
넥스트비티 = 넥스트BT
|
||||
메디프론디비티 = 메디프론
|
||||
우주일렉트로닉스 = 우주일렉트로
|
||||
씨에스 = CS
|
||||
디스플레이테크 = 디스플레이텍
|
||||
씨씨에스충북방송 = 씨씨에스
|
||||
아프리카티비 = 아프리카TV
|
||||
일신바이오베이스 = 일신바이오
|
||||
디엠에스 = DMS
|
||||
한국투자금융지주 = 한국금융지주
|
||||
한국지역난방공사 = 지역난방공사
|
||||
중앙백신연구소 = 중앙백신
|
||||
원익큐엔씨 = 원익QnC
|
||||
에이치비테크놀러지 = HB테크놀러지
|
||||
아이오케이컴퍼니 = 아이오케이
|
||||
이엠따블유 = EMW
|
||||
엘아이지넥스원 = LIG넥스원
|
||||
에스엔유프리시젼 = 에스엔유
|
||||
모두투어네트워크 = 모두투어
|
||||
일진다이아몬드 = 일진다이아
|
||||
젬백스&카엘 = 젬백스
|
||||
동양생명보험 = 동양생명
|
||||
글로벌스탠다드테크놀로지 = GST
|
||||
비에이치아이주식회사 = 비에이치아이
|
||||
미래에셋생명보험 = 미래에셋생명
|
||||
한화생명보험 = 한화생명
|
||||
한화손보 = 한화손해보험
|
||||
에이스테크놀로지 = 에이스테크
|
||||
맥쿼리한국인프라투융자회사 = 맥쿼리인프라
|
||||
케이이씨 = KEC
|
||||
한라아이엠에스 = 한라IMS
|
||||
효성아이티엑스 = 효성ITX
|
||||
웨이브일렉트로닉스 = 웨이브일렉트로
|
||||
아이에스시 = ISC
|
||||
주식회사에스코넥 = 에스코넥
|
||||
마이크로컨텍솔루션 = 마이크로컨텍솔
|
||||
고영테크놀러지 = 고영
|
||||
에스디엔 = SDN
|
||||
주식회사쎄트렉아이 = 쎄트렉아이
|
||||
동국에스엔씨 = 동국S&C
|
||||
KB금융지주 = KB금융
|
||||
KB = KB금융
|
||||
엘지하우시스 = LG하우시스
|
||||
위메이드엔터테인먼트 = 위메이드
|
||||
그랜드코리아레저 = GKL
|
||||
케이피엑스라이프사이언스 = KPX생명과학
|
||||
씨유메디칼시스템 = 씨유메디칼
|
||||
이미지스테크놀로지 = 이미지스
|
||||
케이씨코트렐 = KC코트렐
|
||||
코오롱인더스트리 = 코오롱인더
|
||||
케이엠에이치 = KMH
|
||||
에스제이엠 = SJM
|
||||
한전산업개발 = 한전산업
|
||||
넥스트엔터테인먼트월드 = NEW
|
||||
에프엔씨엔터테인먼트 = 에프엔씨엔터
|
||||
큐브엔터테인먼트 = 큐브엔터
|
||||
에스앤씨엔진그룹리미티드 = 에스앤씨엔진그룹
|
||||
뉴프라이드코퍼레이션 = 뉴프라이드
|
||||
이스트아시아홀딩스인베스트먼트리미티드 = 이스트아시아홀딩스
|
||||
씨케이에이치푸드앤헬스리미티드 = 씨케이에이치
|
||||
부-스타 = 부스타
|
||||
와이지플러스 = YG PLUS
|
||||
YG 플러스 = YG PLUS
|
||||
YG플러스 = YG PLUS
|
||||
삼보산업 주식회사 = 삼보산업
|
||||
갤럭시아 에스엠 = 갤럭시아에스엠
|
||||
주식회사 플레이위드 = 플레이위드
|
||||
신세계아이앤씨 = 신세계 I&C
|
||||
제이와이피엔터테인먼트 = JYP Ent.
|
||||
와이지플러스 = YG PLUS
|
||||
에스.엠.엔터테인먼트 = 에스엠
|
||||
케이에스에스 해운 = KSS해운
|
||||
에스엠컬처앤콘텐츠 = SM C&C
|
||||
DK 유아이엘 = 유아이엘
|
||||
경남제약 주식회사 = 경남제약
|
||||
농업회사법인(주)농우바이오 = 농우바이오
|
||||
SK케미컬 = SK케미칼
|
||||
SKC = SK케미칼
|
||||
주식회사 엠게임 = 엠게임
|
||||
씨제이씨지브이 = CJ CGV
|
||||
씨에스에이코스믹 = CSA 코스믹
|
||||
씨제이이앤엠 = CJ ENM
|
||||
에스지에이 솔루션즈 = SGA솔루션즈
|
||||
주식회사 타이거일렉 = 타이거일렉
|
||||
엑세스바이오 인코퍼레이션 = 엑세스바이오
|
||||
@@ -1,26 +1,26 @@
|
||||
manual-price=1000000
|
||||
buy-price=1000000
|
||||
ann-dart-api=True
|
||||
ann-supply-contract=True
|
||||
ann-supply-contract-rate=20
|
||||
ann-revenue=True
|
||||
ann-revenue-rate=50
|
||||
ann-rights-issue=True
|
||||
ann-patent=True
|
||||
ann-patent-search-string=(미국|중국)
|
||||
ann-profit-change=True
|
||||
ann-profit-change-rate=5
|
||||
mock-trading=False
|
||||
ann-except-modify=True
|
||||
account=335272135
|
||||
sub-account=10
|
||||
dart-api-key1=840943e5370eb9037057beab35f4468fa9a6ce5c
|
||||
dart-api-key2=eba07099d81474c17af615f995d94a517db2c426
|
||||
dart-api-key3=6fcea963a04a6c5b4c4c74a6eee126ce371d47ef
|
||||
dart-api-key4=5b786f58a07b979c94f20e9292c1b8e0314cd88c
|
||||
dart-api-key5=f5559c558971663ee64b6ae03e97292162d16f4b
|
||||
dart-api-key6=9ac67da67a19b44e4c7f0832e9c64979692f6681
|
||||
dart-api-key7=029eb80ddf37d7d0b81ba557a0057978efcdad09
|
||||
dart-api-key8=d1d2009c7f5b4023f8de82d9a167a261cb051521
|
||||
dart-api-key9=0c4eb20c1e1a83c1026c98116ce915d980810324
|
||||
dart-api-key10=98870f0e0bf4f5d1e978629bdcaa2dacd3ff432d
|
||||
manual-price=1000000
|
||||
buy-price=1000000
|
||||
ann-dart-api=True
|
||||
ann-supply-contract=True
|
||||
ann-supply-contract-rate=100
|
||||
ann-revenue=True
|
||||
ann-revenue-rate=100
|
||||
ann-rights-issue=True
|
||||
ann-patent=True
|
||||
ann-patent-search-string=(미국|중국)
|
||||
ann-profit-change=True
|
||||
ann-profit-change-rate=5
|
||||
mock-trading=True
|
||||
ann-except-modify=False
|
||||
account=335057507
|
||||
sub-account=10
|
||||
dart-api-key1=840943e5370eb9037057beab35f4468fa9a6ce5c
|
||||
dart-api-key2=eba07099d81474c17af615f995d94a517db2c426
|
||||
dart-api-key3=6fcea963a04a6c5b4c4c74a6eee126ce371d47ef
|
||||
dart-api-key4=5b786f58a07b979c94f20e9292c1b8e0314cd88c
|
||||
dart-api-key5=f5559c558971663ee64b6ae03e97292162d16f4b
|
||||
dart-api-key6=9ac67da67a19b44e4c7f0832e9c64979692f6681
|
||||
dart-api-key7=029eb80ddf37d7d0b81ba557a0057978efcdad09
|
||||
dart-api-key8=d1d2009c7f5b4023f8de82d9a167a261cb051521
|
||||
dart-api-key9=0c4eb20c1e1a83c1026c98116ce915d980810324
|
||||
dart-api-key10=98870f0e0bf4f5d1e978629bdcaa2dacd3ff432d
|
||||
|
||||
@@ -1,36 +1,36 @@
|
||||
^ 라인의 처음
|
||||
$ 라인의 마지막
|
||||
\w 문자(영숫자) [a-zA-Z_0-9]
|
||||
\s Whitespace (공백,뉴라인,탭..)
|
||||
\d 숫자
|
||||
* Zero 혹은 그 이상
|
||||
+ 하나 이상
|
||||
? Zero 혹은 하나
|
||||
. Newline을 제외한 한 문자
|
||||
[ ] 가능한 문자들
|
||||
[^ ] 가능하지 않은 문자들
|
||||
[ - ] 가능 문자 범위
|
||||
{n,m} 최소 n개, 최대 m개
|
||||
( ) 그룹
|
||||
| 논리 OR
|
||||
|
||||
|
||||
예시
|
||||
.*
|
||||
: "."은 모든 글자, "*"은 0개 이상이므로 모든 글자(아무것도 없는 것 포함)
|
||||
|
||||
.+
|
||||
: "+"는 하나 이상이므로 한개 이상의 아무 글자를 뜻함
|
||||
|
||||
다음.*상승
|
||||
: "다음"과 "상승" 사이에 어떠한 글자가 오더라도(또는 없더라도) 매치
|
||||
|
||||
\d\s억
|
||||
: "모든 숫자"+억 이 들어가면 매치, 띄어쓰기가 들어갈 수 있으므로 \s 포함
|
||||
|
||||
\d{3,5}\s만
|
||||
: 모든 숫자의 3자리부터 5자리까지 + "만"
|
||||
"1만", "10만", "100000만"은 매치가 안되고, "100만", "99999만"은 매치
|
||||
|
||||
[0-9]+\s조
|
||||
: "[0-9]"는 하나의 숫자이므로 "[0-9]+"는 \d와 동일
|
||||
^ 라인의 처음
|
||||
$ 라인의 마지막
|
||||
\w 문자(영숫자) [a-zA-Z_0-9]
|
||||
\s Whitespace (공백,뉴라인,탭..)
|
||||
\d 숫자
|
||||
* Zero 혹은 그 이상
|
||||
+ 하나 이상
|
||||
? Zero 혹은 하나
|
||||
. Newline을 제외한 한 문자
|
||||
[ ] 가능한 문자들
|
||||
[^ ] 가능하지 않은 문자들
|
||||
[ - ] 가능 문자 범위
|
||||
{n,m} 최소 n개, 최대 m개
|
||||
( ) 그룹
|
||||
| 논리 OR
|
||||
|
||||
|
||||
예시
|
||||
.*
|
||||
: "."은 모든 글자, "*"은 0개 이상이므로 모든 글자(아무것도 없는 것 포함)
|
||||
|
||||
.+
|
||||
: "+"는 하나 이상이므로 한개 이상의 아무 글자를 뜻함
|
||||
|
||||
다음.*상승
|
||||
: "다음"과 "상승" 사이에 어떠한 글자가 오더라도(또는 없더라도) 매치
|
||||
|
||||
\d\s억
|
||||
: "모든 숫자"+억 이 들어가면 매치, 띄어쓰기가 들어갈 수 있으므로 \s 포함
|
||||
|
||||
\d{3,5}\s만
|
||||
: 모든 숫자의 3자리부터 5자리까지 + "만"
|
||||
"1만", "10만", "100000만"은 매치가 안되고, "100만", "99999만"은 매치
|
||||
|
||||
[0-9]+\s조
|
||||
: "[0-9]"는 하나의 숫자이므로 "[0-9]+"는 \d와 동일
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
특징주
|
||||
\[SP\]
|
||||
공급계약 체결
|
||||
공급계약체결
|
||||
유상증자결정
|
||||
주요경영사항
|
||||
줄자증권취득결정
|
||||
자율공시
|
||||
수시공시
|
||||
최대주주변경
|
||||
조회공시
|
||||
특징주
|
||||
\[SP\]
|
||||
공급계약 체결
|
||||
공급계약체결
|
||||
유상증자결정
|
||||
주요경영사항
|
||||
출자증권취득결정
|
||||
자율공시
|
||||
수시공시
|
||||
최대주주변경
|
||||
조회공시
|
||||
건설.*수주
|
||||
fn마켓워치
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
\[SP
|
||||
|
||||
|
||||
|
||||
|
||||
5
configure/keyword-negative-keyword-item.txt
Normal file
5
configure/keyword-negative-keyword-item.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
하한가
|
||||
특징주
|
||||
\[SP\]
|
||||
출자증권취득결정
|
||||
조회공시
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="EPPlus" version="4.1.0" targetFramework="net452" />
|
||||
<package id="Microsoft.Office.Interop.Excel" version="15.0.4795.1000" targetFramework="net452" />
|
||||
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net452" />
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="EPPlus" version="4.1.0" targetFramework="net452" />
|
||||
<package id="Microsoft.Office.Interop.Excel" version="15.0.4795.1000" targetFramework="net452" />
|
||||
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net452" />
|
||||
</packages>
|
||||
Reference in New Issue
Block a user