[코딩?] 메모장에 입력된 특정 주소들의 파일을 순서대로 받는방법?

   조회 3173   추천 0    

Downloader.zip (345.7K), Down : 1, 2019-12

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.IO;

using System.Net;

using System.Threading;


namespace Downloader

{

    class Program

    {

        static void Main(string[] args)

        {


            string[] lines = File.ReadAllLines("E:/ backup/list.txt");


            foreach (string entry in lines)

            {


                string savePath = $"E:/backup/{entry.Replace("/", "_")}/";


                try

                {

                    if (!Directory.Exists(savePath))

                    {

                        Directory.CreateDirectory(savePath);

                    }



                    Console.WriteLine("[작업시작] 대상주소: {0}", entry);


                    for(int i = 0;i < 1000;i++)

                    //Parallel.For(0, 1001, new ParallelOptions() { MaxDegreeOfParallelism = 10 }, (i) =>

                     {


                         try

                         {


                             string fullUrl = $"{entry}{i:0000}.txt";


                             string fileName = $"{i:0000}.txt";



                             using (WebClient wc = new WebClient())

                             {

                                wc.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36");

                                 wc.DownloadFile(fullUrl, Path.Combine(savePath, fileName));


                             }



                         }

                         catch (Exception ex)

                         {


                             Console.WriteLine("[오류] {0}", ex.Message);


                            i--;


                            Thread.Sleep(3000);


                         }



                     }//);


                }

                catch (Exception ex)

                {

                    Console.WriteLine("[오류] {0}", ex.Message);

                }

                


            }


            Console.WriteLine("작업 완료");


        }

    }

}





c# 코드입니다


텍스트문서에

a.com/1/

a.com/2/

a.com/3/

b.com/1/

b.com/2/

b.com/3/

이렇게 있다면 a.com_1 폴더 생성후 하위에 0000.txt ~ 1000.txt 로 다운받습니다

Parallel 으로 멀티스레딩 동시에 10개 다운로드하구요, MaxDegreeOfParallelism 를 조절하시면 동시에 병렬작업하실 스레드 갯수를 지정하시면됩니다

하시려는 작업을 상세히 알려주시면 c# 으로 컴파일해서 만들어 드릴수도 있습니다~

짧은글 일수록 신중하게.
길가던뉴비 2019-12
c#이면..더할나위가없네요 ㅎㅎ...

한번 실행해보겠습니다 감사합니다
길가던뉴비 2019-12
지금 발생한 문제가..

1. 병렬로 실행해보니까 공격으로 인식하고 차단해버리네요. 이건 차치하고..
2. 도중에 디스커넥션이 되었을때 프로그램이 꺼지는거.. 한 10초~20초있다 중단된 부분부터 재시작되면 좋겠는데..

이정도가 문제네요. 하려는 작업은 사실 텍스트가 아니라 .ts 스트리밍파일 조각을 긁어보는 건데, 마음처럼 쉽진않네요
주소는 형식은 https://주소/주소/0000.ts ~ https://주소/주소/1000.ts 까지입니다.

병렬부분은 제외하고서라도 중단되면 해당 부분 부터 시간을 준 후 다시시작. 이런거만 가능하고.. 컴파일이 되시는지요??

제 시스템에선 이상하게 컴파일이 안되네요 ..
     
김상혁2 2019-12
혹시 샘플주소를 알려주시면 테스트까지 해서 컴파일 해드릴게요~!
          
길가던뉴비 2019-12
저도 제꺼하는게 아니라 부탁받아하는거라, 주소는 알려드리기 무리가있을것같고. 코드와 같이 주신다면 제가 해결해보도록하겠습니다 (__)

10년이 넘었지만 코드 쓸줄은 몰라도 읽을줄은 알아서 큰 틀만 있어도 괜찮을 것 같습니다.
               
김상혁2 2019-12
우선 본문의 코드내용은 수정했습니다 딜레이 3초로 지정해놨구요 이것은 변경하시면될거같습니다

첨부파일에 비쥬얼스튜디오 솔루션파일 첨부했습니다. 빌드폴더보시면 컴파일된 exe파일도 포함되어잇을거구요

혹시몰라도 User-Agnet는 크롬과 같은것으로 지정해두었습니다
                    
길가던뉴비 2019-12
정말 감사합니다 (__)
                    
길가던뉴비 2019-12
아아.. 번거롭게 해드려 죄송합니다.

            string[] lines = File.ReadAllLines("E:/ backup/list.txt");

            foreach (string entry in lines)
            {

                string savePath = $"E:/backup/{entry.Replace("/", "_")}/";

이 부분 문제였네요.

각 줄을 entry로 받는과정에서, 주소가 entry로 받게되어있어 일부 문자가 폴더명으로 지정되지 못하는 것 같은데,

아예 첫번째 줄은 1번폴더.. 두번째 줄은 2폴더

이런식으로 폴더이름을 배열순서로 바꿀수 있을까요?
                         
길가던뉴비 2019-12
에고 자문자답..

                linenum++;
                string savePath = $"E:/backup/{linenum}/";
추가해서 해결했습니다..
길가던뉴비 2019-12
조언감사합니다.
코드를 읽을 순 있겠는데 C#은 어깨넘어배운데다가.. 다시 수정하려니 문제가 생깁니다.
                        catch (Exception ex)

이 부분을 조금 수정했으면 좋겠는데. 기존 커넥션을 공격으로 간주할경우 슬리프를 유지후 재시도는 유지하면서.
0000.ts를 다운로드 시작해서,
0100.ts까지 정상적으로 다운로드 한 이후
0101.ts 파일이 없어서 404를 반환시
404에러 인식이후는 반복을 탈출해서 다음 줄
0000.ts 부터 다운로드 시작



이러는게 가능할지요? 일단 sleep은 잘 작동하는 듯 합니다..
     
김상혁2 2019-12
기존의 Catch 문위에 WebException 캐치를 추가해주시면됩니다
해당 Http 프로토콜의 오류 Response가 404 (페이지없음)의 경우 해당 반복문을 Break;하게 처리해주면될듯합니다

                        catch (WebException ex)
                        {
                            if (ex.Status == WebExceptionStatus.ProtocolError)
                            {

                                HttpWebResponse response = ex.Response as HttpWebResponse;

                                if (response != null)
                                {
                                    if ((int)response.StatusCode == 404) // Not Found
                                    {
                                        break;
                                    }
                                }
                            }
                        }
          
길가던뉴비 2019-12
에고 기껏 답글도 달아주시고 코딩도해주셨는데 죄송합니다,

exception부분에 i--를 뺀다음에 i++로 바꿔서 계속진행하게하고 로그를따로뽑아서 재시도하게끔짰네요.

(int)response.StatusCode 로 했더니 계속 에러가떠서..

새해 복 많이받으시고 다시한번 감사합니다. 작업 다 끝냈네요 ㅎㅎ


QnA
제목Page 1180/5731
2014-05   5267947   정은준1
2015-12   1792966   백메가
2018-06   4770   박문형
2022-04   2145   무아
2015-02   13675   장동건2014
2019-08   3742   눈팅돌이
2011-01   7795   김장우
2011-01   6486   김상일
2016-04   4516   안형곤
2019-08   2503   머리감자
2022-04   2566   L2스위치
2016-04   8204   장동건2014
2016-04   4244   하헤맨굿
2013-10   6223   s김종화z
2015-02   4006   전설속의미…
2013-10   25568   남은종
2017-03   3924   이선호
2024-01   3106   박문형
2020-11   2633   구차니
2011-03   6756   이병한
2015-02   5706   장동건2014
2013-10   5722   배고프고가…