rainit2006 / My_Windows

0 stars 0 forks source link

常用处理 #22

Open rainit2006 opened 6 years ago

rainit2006 commented 6 years ago

rainit2006 commented 6 years ago

rainit2006 commented 6 years ago

在TaskScheduler里创建一个Task

C++

C#

rainit2006 commented 6 years ago

从URL里下载文件 C++ ■关键函数:

参照サイト:

■项目代码

    InternetError_Enum enResult = STATUS_OK;
    HINTERNET hInternet = NULL;
    HINTERNET hHttp = NULL;
    HINTERNET hReq = NULL;

    DWORD dwTotalRead = 0UL;
    DWORD dwContentLength = 0UL;
    BYTE aucBuff[BUFFBLOCK];
    BYTE *pucReadContent = NULL;
    CString csETag;

    SecureZeroMemory(aucBuff, BUFFBLOCK);

    do
    {
        hInternet  = ::InternetOpen(
            USER_AGENT,
            PRE_CONFIG_INTERNET_ACCESS,
            //INTERNET_OPEN_TYPE_DIRECT,
            NULL,
            NULL,
            0);
        if ( NULL == hInternet )
        {
            enResult = FAILED_TO_SEND;
            break;
        }

        InternetSetOption(hInternet, INTERNET_OPTION_IGNORE_OFFLINE, NULL, 0);

        hHttp = ::InternetConnect(
            hInternet,
            m_strServerURL,
            m_wPort, 
            NULL, 
            NULL, 
            INTERNET_SERVICE_HTTP,
            0,
            NULL);
        if ( NULL == hHttp )
        {
            enResult = FAILED_TO_SEND;
            break;
        }

        LPCTSTR AcceptTypes[2] = {_T("*/*"), NULL}; 
        if ( m_bIsSecure )
        {
            hReq = ::HttpOpenRequest(
                hHttp,
                INTERNET_GET,
                m_strFilePath,
                _T("HTTP/1.1"),
                NULL,
                AcceptTypes,
                INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_SECURE |
                INTERNET_FLAG_IGNORE_CERT_CN_INVALID | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID,
                0) ;
        }
        else
        {
            hReq = ::HttpOpenRequest(
                hHttp,
                INTERNET_GET,
                m_strFilePath,
                _T("HTTP/1.1"),
                NULL,
                AcceptTypes,
                INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE,
                0) ;
        }
        if ( NULL == hReq )
        {
            enResult = FAILED_TO_SEND;
            break;
        }
        AddHeader(hReq, HTTP_HEADER_HOST, m_strServerURL);
        AddHeader(hReq, HTTP_HEADER_ACCEPT, HTTP_ACCEPT_VALUE);
        AddHeader(hReq, HTTP_HEADER_USERAGENT, USER_AGENT);
        if ( !m_strETag.IsEmpty() )
        {
            AddHeader(hReq, HTTP_HEADER_IFNONEMATCH, m_strETag);
        }

        if ( !::HttpSendRequest (hReq, NULL, 0, NULL, 0) )
        {
            DWORD d = GetLastError();
            if ( ERROR_INTERNET_INVALID_CA == d )
            {
                DWORD dwFlags = 0;
                DWORD dwBuffLen = sizeof(dwFlags);

                InternetQueryOption (hReq, INTERNET_OPTION_SECURITY_FLAGS,
                    (LPVOID)&dwFlags, &dwBuffLen);

                dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
                InternetSetOption (hReq, INTERNET_OPTION_SECURITY_FLAGS,
                    &dwFlags, sizeof (dwFlags) );

                if ( !::HttpSendRequest(hReq, NULL, 0, NULL, 0) )
                {
                    enResult = FAILED_TO_SEND;
                    break;
                }
            }
            else
            {
                enResult = FAILED_TO_SEND;
                break;
            }
        }

        TCHAR awcStatusCode[33];
        DWORD dwInfoSize = 64;
        SecureZeroMemory(awcStatusCode, sizeof(awcStatusCode));
        if ( !HttpQueryInfo (hReq,
            HTTP_QUERY_STATUS_CODE, 
            awcStatusCode, 
            &dwInfoSize, 
            NULL) )
        {
            enResult = REQUEST_ERROR;
            break;
        }
        awcStatusCode[dwInfoSize / sizeof(TCHAR)] = 0;
        long lStatusCode = _ttol(awcStatusCode);

        if ( HTTP_STATUS_OK == lStatusCode )
        {
            enResult = STATUS_OK;
        }
        else if ( HTTP_STATUS_NOT_FOUND == lStatusCode )
        {
            enResult = NOT_FOUND;
            dwTotalRead = 0;
            break;
        }
        else if ( HTTP_STATUS_NOT_MODIFIED == lStatusCode )
        {
            enResult = STATUS_NOT_MODIFY;
            csETag = m_strETag;
            dwTotalRead = 0;
            break;
        }
        else
        {
            enResult = REQUEST_ERROR;
            break;
        }
        dwInfoSize = 64;
        SecureZeroMemory(awcStatusCode, sizeof(awcStatusCode));
        if ( !HttpQueryInfo (hReq,
            HTTP_QUERY_ETAG, 
            awcStatusCode, 
            &dwInfoSize, 
            NULL))
        {
            csETag = _T("");
        }
        else
        {
            awcStatusCode[dwInfoSize / sizeof(TCHAR)] = 0;
            csETag = awcStatusCode;
        }
        dwInfoSize = 64;
        SecureZeroMemory(awcStatusCode, sizeof(awcStatusCode));
        if ( !HttpQueryInfo (hReq,
            HTTP_QUERY_CONTENT_LENGTH, 
            awcStatusCode, 
            &dwInfoSize, 
            NULL))
        {
            enResult = BAD_PACKET;
            break;
        }
        awcStatusCode[dwInfoSize / sizeof(TCHAR)] = 0;
        dwContentLength = _ttol(awcStatusCode);
        pucReadContent = new BYTE[dwContentLength];
        if ( !pucReadContent )
        {
            enResult = MEMERORY_ERROR;
            break;
        }
        SecureZeroMemory(pucReadContent, dwContentLength);
        DWORD dwRead = 0;
        while ( ::InternetReadFile(hReq, aucBuff, sizeof(aucBuff), &dwRead) )
        {
            if ( (0 ==dwRead) || m_bQuitGet || ((dwContentLength - dwTotalRead) < 0))
            {
                break;
            }
            memcpy_s(pucReadContent + dwTotalRead, dwContentLength - dwTotalRead, aucBuff, dwRead); 
            dwTotalRead += dwRead;
        }
        if ( dwContentLength != dwTotalRead)
        {
            enResult = BAD_PACKET;
            break;
        }
    }while( false );
    if ( hReq )
    {
        InternetCloseHandle(hReq);
        hReq = NULL;
    }
    if ( hHttp )
    {
        InternetCloseHandle(hHttp);
        hHttp = NULL;
    }
    if ( hInternet )
    {
        ::InternetCloseHandle(hInternet);
        hInternet = NULL;
    }
rainit2006 commented 6 years ago

C#でnullチェックを簡潔に行うには?

// ……何らかの処理……

    // if (description == null) {
    //   description = title;
    // }
    // と↓は同じ

    description = description ?? title; // 「??」はnull合体演算子

问号 (1)、C#语法中一个个问号(?)的运算符是指:值类型后面加问号表示可为空null(Nullable 结构) MSDN上面的解释: 在处理数据库和其他包含不可赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型以及日期类型的功能特别有用。例如,数据库中的布尔型字段可以存储值 true 或 false,或者,该字段也可以未定义。

(2)、C#语法中两个问号(??)的运算符是指null 合并运算符,合并运算符为类型转换定义了一个预设值,以防可空类型的值为Null。

MSDN上面的解释: ?? 运算符称为 null 合并运算符,用于定义可以为 null 值的类型和引用类型的默认值。如果此运算符的左操作数不为 null,则此运算符将返回左操作数(左边表达式);否则当左操作数为 null,返回右操作数(右边表达式)。

int? num = null;   //正确
int num = null;    //错误
int? x = null;//定义可空类型变量
int? y = x ?? 1000;//使用合并运算符,当变量x为null时,预设赋值1000

Nullable 结构支持 将值类型 扩展为可以为null,但不支持 在引用类型(string, class, object都是引用类型) 上使用,因为引用类型本身就是可空的。

设置值的写法 Arg = value;
获取值的写法 Arg.Value;
判断非空的写法 Arg.HasValue

null 条件演算子 null をチェックしていなければ、メソッドは NullReferenceException をスローすることになります。これは単純ですが、文字列パラメーターが null かどうかを確認しなければならないのはやや面倒です。多くの場合、比較の頻度を考えれば無駄な処理です。C# 6.0 では、このようなチェックをより簡潔に記述できる null 条件演算子が新しく導入されました。

string result = value;
  if (value != null) // Skip empty string check for elucidation
  {
    result = value.Substring(0, Math.Min(value.Length, length));
  }
return result;

変更:

return value?.Substring(0, Math.Min(value.Length, length));

注意,null运算符返回的是nullable型(比如int? , 而不是int。否则报错) int length = text?.Length; // Compile Error: Cannot implicitly convert type 'int?' to 'int'