Это довольно мелкий, 371 каталог со средним числом 10 файлов в каждом каталоге. некоторые каталоги содержат другие суб-каталоги
Это просто комментарий, но ваши цифры действительно довольно высоки. Я запустил приведенное ниже, используя, по сути, тот же рекурсивный метод, который вы используете, и мое время намного меньше, несмотря на создание вывода строки.
public void RecurseTest(DirectoryInfo dirInfo,
StringBuilder sb,
int depth)
{
_dirCounter++;
if (depth > _maxDepth)
_maxDepth = depth;
var array = dirInfo.GetFileSystemInfos();
foreach (var item in array)
{
sb.Append(item.FullName);
if (item is DirectoryInfo)
{
sb.Append(" (D)");
sb.AppendLine();
RecurseTest(item as DirectoryInfo, sb, depth+1);
}
else
{ _fileCounter++; }
sb.AppendLine();
}
}
Я запустил приведенный выше код для ряда различных каталогов. На моей машине второй вызов для сканирования дерева каталогов обычно выполнялся быстрее из-за кэширования как во время выполнения, так и в файловой системе. Обратите внимание, что эта система не является чем-то особенным, это всего лишь 1-летняя рабочая станция для разработки.
// cached call Dirs = 150, files = 420, max depth = 5 Time taken = 53 milliseconds // cached call Dirs = 1117, files = 9076, max depth = 11 Time taken = 433 milliseconds // first call Dirs = 1052, files = 5903, max depth = 12 Time taken = 11921 milliseconds // first call Dirs = 793, files = 10748, max depth = 10 Time taken = 5433 milliseconds (2nd run 363 milliseconds)
Обеспокоенный тем, что я не получил дату создания и изменения, код был изменен, чтобы вывести это также в следующие моменты времени.
// now grabbing last update and creation time. Dirs = 150, files = 420, max depth = 5 Time taken = 103 milliseconds (2nd run 93 milliseconds) Dirs = 1117, files = 9076, max depth = 11 Time taken = 992 milliseconds (2nd run 984 milliseconds) Dirs = 793, files = 10748, max depth = 10 Time taken = 1382 milliseconds (2nd run 735 milliseconds) Dirs = 1052, files = 5903, max depth = 12 Time taken = 936 milliseconds (2nd run 595 milliseconds)
Примечание. Класс System.Diagnostics.StopWatch используется для синхронизации.
Java поддерживает конфигурацию прокси Socks через зарегистрированный java.net.Authenticator
или через настройки, как описано в Networking Properties :
протокол SOCKS настройки поддержки
Имя пользователя и пароль SOCKS приобрел следующим образом. Первый, если приложение зарегистрировало
java.net.Authenticator
по умолчанию экземпляр, тогда это будет запрошено с протоколом, установленным в строку "SOCKS5", а подсказка установлена на строка «SOCKS аутентификация». Если аутентификатор не возвращает имя пользователя / пароль или если нет аутентификатор регистрируется, затем система проверяет настройки пользователя "java.net.socks.username
" и «java.net.socks.password
». Если эти предпочтений не существует, то системное свойство "user.name
" проверено для имени пользователя. В этом случае нет предоставляется пароль.socksProxyHost
socksProxyPort (по умолчанию: 1080)
Указывает имя прокси-сервера SOCKS и номер порта, который будет использоваться уровнем протокола SOCKS. Если указан socksProxyHost, то все сокеты TCP будут использовать прокси-сервер SOCKS для установления или принятия соединения. Прокси-сервер SOCKS может быть сервером SOCKS v4 или v5 и должен разрешать неаутентифицированные соединения.
Примеры клиентского кода вы можете проверить этот ответ в Stack Overflow.
РЕДАКТИРОВАТЬ: Обновление ответа согласно комментарию
Побочным эффектом поддержки SOCKS в JDK является то, что ваш вся JVM будет проходить через один и тот же прокси-сервер SOCKS. Так что это может не сработать для вас.
Authenticator
влияет на всю аутентификацию в вашей JVM (HTTP-аутентификация, Proxy Auth). Опять же, это может не сработать для вас.
В вашем случае, возможное решение - использовать HttpClient из HttpComponents (преемник устаревшего Commons HTTP Client 3.x ). Посмотрите примеры и особенно Запрос через прокси и Примеры аутентификации через прокси .
Используйте этот HttpClient (не Apache),
http://www.innovation.ch/java/HTTPClient/
Это просто обработчик URL, поэтому вы можете использовать обычный HTTPUrlConnection. Он поддерживает SOCKS и другие прокси.