7 / 7 / 5
Регистрация: 14.07.2014
Сообщений: 554

Многопоточная закачка файлов: закачиваются только файлы размером менее 9 кб

08.09.2014, 00:00. Показов 2726. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вообщем такая проблема кинули код чтобы сделать загрузку всех файлов на сервере начал его переделывать
хотел сделать закачку чрез DownloadFileAsync чтобы программа не зависала вроде все сделал запускаю он качает но выше 9 кб дело не идет а есть загружать через DownloadFile то программа файлы загружает как нужно но при этом она зависает. подскажите как можно сделать чтобы программа успешно качала все файлы и при этом не зависала
вот фотки
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.09.2014, 00:00
Ответы с готовыми решениями:

Записать имена и размер всех файлов каталога К в файл F (выбрать файлы с размером менее 100 Kb)
Записать имена и размер всех файлов каталога К в файл F (выбрать файлы с размером менее 100 Kb). Т.е. у меня есть файлы 2 erfsfs - 42 кб ...

Не закачиваются файлы на телефон
Nokia 5530.После того как перенес несколько треков на телефон,выдернул соединительный кабель из ноута без безопасного извлечения...

Не закачиваются файлы на сервер
После переноса нескольких сайтов с разными движками на выделенный сервер с Apache обнаружилась странная проблема - невозможно через скрипты...

19
320 / 280 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
08.09.2014, 11:59
Вы вместо того, что бы скрин кидать, лучше бы написали какую технологию используете, и выложили исходный код, т.к. не понятно в каком потоке вы это все вызываете.
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
08.09.2014, 12:13
ммм... может нужно использовать разные экземляры WebClient, а не один?
1
7 / 7 / 5
Регистрация: 14.07.2014
Сообщений: 554
08.09.2014, 13:34  [ТС]
Вот собственно код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
private void button4_Click(object sender, EventArgs e)
        {
                    string directory = "Download/" + GamePatch;
                    string url = "http://www.ibiblio.org/pub/X11/contrib/graphics/";
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                    {
                        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
                        {
                            string html = reader.ReadToEnd();
                            Regex regex = new Regex("<a href=\".*\">(?<name>.*)</a>");
                            MatchCollection matches = regex.Matches(html);
                            if (matches.Count > 0)
                            {
                                foreach (Match match in matches)
                                {
                                    String name = match.Groups["name"].ToString();
                                    if (match.Success && name.LastIndexOf("/") != name.Length - 1)
                                    {
                                        Console.Write("download file:" + match.Groups["name"]);
 
                                        try
                                        {
                                            String fileName = name;
                                            if (name.IndexOf("?") != -1)
                                            {
                                                fileName = name.Replace('?', '_');
 
                                            }
                                            using (WebClient Client = new WebClient())
                                            {
                                                Client.DownloadFileAsync(new Uri(url), @"Downloader\" + System.IO.Path.GetFileName(fileName));
                                            }
                                            Console.Write("\tSuccessful download\r\n");
                                        }
                                        catch (Exception)
                                        {
                                            Console.Write("\tError!\r\n");
                                        }
 
 
 
                                    }
                                }
                            }
                        }
                    }
        }
Поставил еще 1 экземляр для WebClient и все равно проблемы
0
1167 / 885 / 517
Регистрация: 09.04.2014
Сообщений: 2,098
08.09.2014, 13:52
Цитата Сообщение от Bo0m21 Посмотреть сообщение
using (WebClient Client = new WebClient()) { Client.DownloadFileAsync(new Uri(url), @"Downloader\" + System.IO.Path.GetFileName(fileName)); }
вы тут неявно вызываете Client.Dispose(), что и "убивает" вашу закачку

вообще-то ваш код написан под использование Client.DownloadFile, а не Client.DownloadFileAsync

Добавлено через 3 минуты
для асихронного скачивания посмотрите пример
1
320 / 280 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
08.09.2014, 14:08
Есть более наглядный пример, как нужно использовать BackgroundWorker http://msdn.microsoft.com/en-u... s.90).aspx
1
1167 / 885 / 517
Регистрация: 09.04.2014
Сообщений: 2,098
08.09.2014, 14:10
только вот используя BackgroundWorker не удастся показать прогресс скачивания файлов
1
7 / 7 / 5
Регистрация: 14.07.2014
Сообщений: 554
08.09.2014, 14:41  [ТС]
Вообщем закачку настроил
А как мне еще например все файлы взять за 100% и чтобы показывало процесс загрузки не 1 файла а всех сразу
0
1167 / 885 / 517
Регистрация: 09.04.2014
Сообщений: 2,098
08.09.2014, 14:42
кино
1
7 / 7 / 5
Регистрация: 14.07.2014
Сообщений: 554
08.09.2014, 15:10  [ТС]
А как мне еще например все файлы взять за 100% и чтобы показывало процесс загрузки не 1 файла а всех сразу

Добавлено через 7 минут
Чтобы например такого не было а просто по окончанию всех загрузок было выведено 1 раз


Добавлено через 16 минут
Блин все равно качает по 9 кб
1
23 / 23 / 6
Регистрация: 23.03.2013
Сообщений: 245
08.09.2014, 16:03
Вот класс написал для загрузки файлов и пример его использования

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.IO;
using System.Net;
using System.ComponentModel;
 
namespace TestProjectForSol
{
    class Program
    {
 
       
 
        static string GetFileNameFromUrl ( string url, int id )
        {
            Uri u = new Uri( url );
            string filename = string.Empty;
 
            if ( u.IsFile )
                filename = Path.GetFileName( u.AbsolutePath );
            else
            {
                string file = "_";
                string s = url;
                string [ ] st = new String [ 20 ];
                st = s.Split( '/' );
                foreach ( string sub in st )
                {
                    file = sub;
                }
                filename = id.ToString( ) + file ;
            }
            return filename;
        }
 
        static void Main ( string [ ] args )
        {
            int downloadlimit = 10;
 
            Console.WriteLine( "Куда сохранять файлы: (например D:\\ или D:\\path\\ " );
            string dirtosave = Console.ReadLine( );
            try
            {
                if ( !Directory.Exists( dirtosave ) )
                {
 
                    Directory.CreateDirectory( dirtosave );
                }
 
            }
            catch
            {
                Console.WriteLine( "Неверная директория, сохраняю на D:\\" );
                dirtosave = "D:\\";
            }
            Console.WriteLine( "Путь к файлу со списком URL filelist.txt:" );
            string filelist = Console.ReadLine( );
            if (!File.Exists(filelist))
            {
                Console.WriteLine( "Не найден файл" );
                Console.ReadLine( );
                Console.ReadLine( );
            }
 
            string [ ] urllist = File.ReadAllLines( filelist );
 
            List<DownloadFileClass> FilesToDownload = new List<DownloadFileClass>( );
 
            int id = 0;
            foreach ( string file in urllist )
            {
                id++;
                string path = dirtosave + GetFileNameFromUrl( file, id );
                DownloadFileClass tempfc = new DownloadFileClass( file , path , id );
                new Thread( tempfc.StartDownload ).Start( );
                FilesToDownload.Add( tempfc );
                if ( id > downloadlimit )
                    break;
            }
 
 
            Console.Clear( );
 
            int x = Console.CursorLeft;
            int y = Console.CursorTop;
            while ( true )
            {
                Console.Clear( );
                foreach ( DownloadFileClass dwnloadprogress in FilesToDownload )
                {
                    id = dwnloadprogress.id;
                    Console.SetCursorPosition(x+0,y+id+1  );
                    if ( dwnloadprogress.error )
                    {
                        Console.Write( "\r Скачиваю файл:" + dwnloadprogress.filename + ". Загружено: ОШИБКА ЗАГРУЗКИ" );
                    }
                    else
                    {
                        Console.Write( "\r Скачиваю файл:" + dwnloadprogress.filename + ". Загружено:" + dwnloadprogress.percentage + "%." );
                    }
                }
                Thread.Sleep( 100 );
            }
 
            Console.ReadLine( );
            Console.ReadLine( );
        }
    }
 
    public class DownloadFileClass
    {
        public long percentage;
        public long filesize;
        public long currentpos;
        public bool error;
        private string fullpath;
        public string filename;
        public string url = string.Empty;
        public bool completed;
        private WebClient downloader;
        public int id;
        public DownloadFileClass(string url, string path, int id = 0)
        {
            this.url = url;
            this.error = false;
            this.id = id;
            this.percentage = 0;
            this.fullpath = path;
            this.filename = Path.GetFileName( path );
            this.filesize = 0;
            this.downloader = new AwesomeWebClient( );
            downloader.DownloadProgressChanged += new DownloadProgressChangedEventHandler( client_DownloadProgressChanged );
            this.completed = false;
            downloader.DownloadFileCompleted += new AsyncCompletedEventHandler( client_DownloadFileCompleted );
 
            if ( File.Exists(path))
            {
                File.Delete( path );
            }
 
          
        }
 
        public void StartDownload()
        {
            try
            {
                downloader.DownloadFileAsync( new Uri( url ) , fullpath );
            }
            catch
            {
                error = true;
                downloader.Dispose( );
            }
        }
 
        private void client_DownloadProgressChanged ( object sender , DownloadProgressChangedEventArgs e )
        {
 
            percentage = e.ProgressPercentage;
           
            filesize =e.TotalBytesToReceive;
            currentpos =  e.BytesReceived ;
 
            
        }
 
        void client_DownloadFileCompleted ( object sender , AsyncCompletedEventArgs e )
        {
            completed = true;
            downloader.Dispose( );
            if (e.Cancelled)
            {
                error = true;
                completed = false;
               
            }
            if ( e.Error != null )
            {
                error = true;
            }
        }
 
 
 
    }
 
    class AwesomeWebClient : WebClient
    {
        protected override WebRequest GetWebRequest ( Uri address )
        {
            HttpWebRequest req = ( HttpWebRequest ) base.GetWebRequest( address );
            req.ServicePoint.ConnectionLimit = 10;
            return ( WebRequest ) req;
        }
    }
}
скриншот:
Миниатюры
Многопоточная закачка файлов: закачиваются только файлы размером менее 9 кб  
1
7 / 7 / 5
Регистрация: 14.07.2014
Сообщений: 554
08.09.2014, 18:06  [ТС]
А если для WF его переделать все норм качать будет?
0
320 / 280 / 109
Регистрация: 27.09.2010
Сообщений: 1,058
08.09.2014, 18:30
Цитата Сообщение от titans2011 Посмотреть сообщение
лучше бы написали какую технологию используете
Вы проигнорировали мой вопрос, и все равно к нему вернулись! Зачем.....
1
7 / 7 / 5
Регистрация: 14.07.2014
Сообщений: 554
08.09.2014, 18:47  [ТС]
Да я писал что он мне не подходит только видимо правил и случайно удалил
И там показано как качать 1 файл вроде.
1 файл я могу написать код чтобы качались а вот например чтобы качались все файлы в данной папке уже нет
и в выше представленном разобраться никак не могу
1
23 / 23 / 6
Регистрация: 23.03.2013
Сообщений: 245
08.09.2014, 19:16
Bo0m21, все просто. Нужно вставить класс AwesomeWebClient и DownloadFileClass в свой проект, затем
C#
1
2
DownloadFileClass DwnlFile = new DownloadFileClass( file , path , id ); 
new Thread( DwnlFile.StartDownload ).Start( ); // или просто tempfc.StartDownload();
file - URL
path - имя файла для сохранения
//id - задать ID файла, можно 0 если не используется

а что бы получить % скачивания

C#
1
DwnlFile.percentage
а хранить файлы нужно в List<DownloadFileClass> ... если качать несколько

.error - если true - произошла ошибка
.completed -true когда загрузка завершена

качает файлы в async режиме
1
7 / 7 / 5
Регистрация: 14.07.2014
Сообщений: 554
08.09.2014, 19:46  [ТС]
Блин моих знаний не хватает чтобы допереть до этого
0
23 / 23 / 6
Регистрация: 23.03.2013
Сообщений: 245
08.09.2014, 20:17
Если используется .net 4+ то можно parralel foreach использовать для загрузки всех файлов



C#
1
2
 foreach (Match match in matches)
                                {
это заменить на

C#
1
2
3
4
5
using System.Threading;
using System.Threading.Tasks;
...
Parallel.ForEach( matches, new ParallelOptions { MaxDegreeOfParallelism = 10 } , match =>
            {
1
7 / 7 / 5
Регистрация: 14.07.2014
Сообщений: 554
08.09.2014, 22:25  [ТС]
Цитата Сообщение от karaulov6 Посмотреть сообщение
Если используется .net 4+ то можно parralel foreach использовать для загрузки всех файлов



C#
1
2
 foreach (Match match in matches)
                                {
это заменить на

C#
1
2
3
4
5
using System.Threading;
using System.Threading.Tasks;
...
Parallel.ForEach( matches, new ParallelOptions { MaxDegreeOfParallelism = 10 } , match =>
            {
Хм странно



Добавлено через 1 час 50 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        // Загрузка файла
        private void button4_Click(object sender, EventArgs e)
        {
 
 
            // A simple source for demonstration purposes. Modify this path as necessary.
            string[] files = System.IO.Directory.GetFiles(@"C:\Users\Public\Pictures\Sample Pictures", "*.jpg");
            string newDir = @"C:\1234\";
            System.IO.Directory.CreateDirectory(newDir);
 
            //  Method signature: Parallel.ForEach(IEnumerable<TSource> source, Action<TSource> body)
            Parallel.ForEach(files, currentFile =>
            {
                // The more computational work you do here, the greater 
                // the speedup compared to a sequential foreach loop.
                string filename = System.IO.Path.GetFileName(currentFile);
                System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(currentFile);
 
                bitmap.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
                bitmap.Save(System.IO.Path.Combine(newDir, filename));
 
                // Peek behind the scenes to see how work is parallelized.
                // But be aware: Thread contention for the Console slows down parallel loops!!!
                label2.Text = "Processing {0} on thread {1}";
 
            } //close lambda expression
                 ); //close method invocation
 
            // Keep the console window open in debug mode.
            label2.Text = "Processing complete. Press any key to exit.";
 
 
        }
Вот допустим код только он копирует файлы из 1 в другую а как переписать чтобы загружал поочередно с сервера
0
23 / 23 / 6
Регистрация: 23.03.2013
Сообщений: 245
08.09.2014, 22:50
Цитата Сообщение от Bo0m21 Посмотреть сообщение
Хм странно
Там в конце нужно было дописать после } : );
1
7 / 7 / 5
Регистрация: 14.07.2014
Сообщений: 554
09.09.2014, 11:18  [ТС]
Цитата Сообщение от karaulov6 Посмотреть сообщение
Там в конце нужно было дописать после } : );
дак я дописал все и вот такая ошибка

Добавлено через 12 часов 15 минут
P.S Кто поможет решить проблему?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.09.2014, 11:18
Помогаю со студенческими работами здесь

Не закачиваются большие файлы на яндекс.народ
На яндекс.народе написано, что можно закачивать файлы до 5 гб, но у меня ничего не получается. Маленькие раньше закачивал, а с большими...

Скрипт загружает файлы только размером 25-50кб
&lt;? $dirr='papkasfotkami/' echo ' &lt;title&gt;Upload many files&lt;/title&gt; &lt;form action=new.php method='post' enctype='multipart/form-data'&gt;...

Определить, есть ли в каталоге файлы с именами длиной более или менее 8-ми символов, не перебирая имена файлов
Как определить в каталоге есть ли файлы больше или меньше 8 символов не перебирая название каждого файла?

Закачка файлов
Не знал в каком разделе задать свой вопрос, решил тут. Ситуация такая. удаленный хост : датацентр под никсами и широким инетом. ...

Закачка файлов
Здравствуйте. Я уже спрашивал тут про множественную закачку файлов, и мне скинули вот этот скрипт: $filePath = 'upload'; if...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru