Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
(x(x_(x_x(О_о)x_x)_x)x)
64 / 56 / 6
Регистрация: 04.09.2010
Сообщений: 301
1

Рекурсивный алгоритм поиска файла на фтп

09.04.2013, 00:26. Показов 2870. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер форумчане.Столкнулся с проблемой в понимании рекурсивного алгоритма поиска файла на фтп.
Для работы с фтп использую библиотеку BytesRoad.NetSuit.
Код:
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
void FileSearch(string dir,string filename)
{
 if (!client.IsConnected) {
   client.Connect(info.TimeOut, info.Addres, info.Port);
   client.Login(info.TimeOut, info.User, info.Password);
}
try
{
 client.ChangeDirectory(info.TimeOut,dir);
 FtpItem[] items = client.GetDirectoryList(info.TimeOut * 100);
 
 foreach (FtpItem item in items)
 {
   if (item.ItemType == FtpItemType.File && item.Name == filename)
    logRichTextBox.AppendText("Нашли в:" + client.GetWorkingDirectory(info.TimeOut) + "\n");
   if (item.ItemType == FtpItemType.Directory)
   {
    logRichTextBox.AppendText("->" + item.Name + "\n");
    FileSearch(item.Name,filename);
   }
 }
}
catch (Exception ex)
{
  MessageBox.Show(ex.ToString());
}
}
Проблема:
Есть иерархия
dir1
--dir11
---dir111
----file111_1
----file111_2
---dir112
----file112_1
--dir12
--dir13
dir2
--dir21
--dir22

Алгоритм доходит до dir111 и вместо того, что бы перейти на уровень выше и после перейти в dir112 он пытается перейти в каталог dir111/dir112.
Методы для перехода вверх:
C#
1
client.ChangeDirectory(info.TimeOut,"..");
или
C#
1
client.ChangeDirectoryUp(info.TimeOut);
Подскажите, где нужно поставить эти методы, что бы путешествие по дереву каталогов было удачным?или как можно перестроить алгоритм?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2013, 00:26
Ответы с готовыми решениями:

Рекурсивный метод поиска файлов
На одном сайте нашел рекурсивный метод прохода по каталогам и вложенным каталогам на диске. С...

Рекурсивный алгоритм поиска перестановок
Реализуйте рекурсивный алгоритм поиска перестановок

Реализовать рекурсивный алгоритм поиска минимального элемента массива
Реализовать рекурсивный алгоритм поиска минимального элемента массива. Приведем сначала функцию,...

Нужен алгоритм поиска пути в этом лабиринте (будь то волновой алгоритм или алгоритм правой/левой руки )
#include "stdafx.h" #include <iostream> #include <conio.h> using namespace std; void lab...

9
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.04.2013, 07:22 2
Athlon_33_88, ну условие остановки должно быть хоть где-то. У вас логика неправильная. У вас же не линейный список, а дерево, причем сильноветвящееся, а значит, нужно что-то вроде того
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
string FileSearh(string filename);
{
   if (filename == NEEDED)
      return filename;
   if (filename == NONFOLDER)
      return string.Empty;
   foreach(string s in ITEMS)
   {
      var res = FileSearch(s);
      if (res != string.Empty)
         return res;
   }
   return "NOT FOUND";
}
логика должна быть такой
0
(x(x_(x_x(О_о)x_x)_x)x)
64 / 56 / 6
Регистрация: 04.09.2010
Сообщений: 301
09.04.2013, 20:33  [ТС] 3
Метод апгрейдил, но он не работает.
Не могу понять, как задать условие, для перехода на уровень вверх...
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
        string FileSearch(string dir,string filename)
        {
            if (!client.IsConnected) {
                client.Connect(info.TimeOut, info.Addres, info.Port);
                client.Login(info.TimeOut, info.User, info.Password);
            }
            try
            {
                client.ChangeDirectory(info.TimeOut, dir); 
                FtpItem[] items = client.GetDirectoryList(info.TimeOut * 100);
 
                foreach (FtpItem item in items)
                {
                    
                    if (item.ItemType == FtpItemType.File)
                    {
                        if (item.Name == filename)
                        {
                            return filename;
                        }
                        else
                        {
                            return string.Empty;
                        }
                    }
                            
                    if (item.ItemType == FtpItemType.Directory)
                    {
                        var result = FileSearch(item.Name,filename);
                        if (result != string.Empty)
                            return result;
                    }
                    client.ChangeDirectory(info.TimeOut, "..");
                }
 
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
                return string.Empty;
            }
            return "NOT FOUND";
        }
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.04.2013, 20:48 4
Athlon_33_88, не нужно вверх переходить. Я вам уже весь алгоритм дал.

Добавлено через 3 минуты
C#
1
client.ChangeDirectory(info.TimeOut, "..");
Это вообще зачем?
0
(x(x_(x_x(О_о)x_x)_x)x)
64 / 56 / 6
Регистрация: 04.09.2010
Сообщений: 301
09.04.2013, 20:55  [ТС] 5
Цитата Сообщение от Psilon Посмотреть сообщение
C#
1
client.ChangeDirectory(info.TimeOut, "..");
это метод для перехода на уровень вверх (строчка была добавлена для эксперемента, но и с ней не работает).
В модернизированном методе все ветки возвращают значение, но алгоритм упорно пытается пытается перейти в директорию, которая находится на уровень выше.Если не ясно выражаюсь, то прошу прощения.Могу написать длинный пост с наиподробнейшим описанием проблемы.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.04.2013, 21:16 6
Athlon_33_88, этот пункт не нужен. НИкуда переходить на уровень выше не надо. Перебираются все файлы, если там находится искомый файл, то он возвращается. Если нет, то эта процедура последовательно применяется ко всем папкам.

Добавлено через 14 минут
Athlon_33_88, вот пример поиска в каталоге файла
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
using System;
using System.IO;
 
namespace ConsoleApplication19
{
    class Program
    {
        static void Main()
        {
            string s = GetFile("C:\\", "input.txt");
            Console.WriteLine(s == string.Empty ? "NOT FOUND" : s);
            Console.ReadKey();
        }
 
        private static string GetFile(string path, string search)
        {
            var di = new DirectoryInfo(path);
            try
            {
                foreach (var enumerateFile in di.EnumerateFiles())
                {
                    if (enumerateFile.Name == search)
                        return Path.Combine(path, search);
                }
                foreach (var directoryInfo in di.EnumerateDirectories())
                {
                    var file = GetFile(directoryInfo.FullName, search);
                    if (file != string.Empty)
                        return file;
                }
            }
            catch {}
 
            return "";
        }
    }
}
1
(x(x_(x_x(О_о)x_x)_x)x)
64 / 56 / 6
Регистрация: 04.09.2010
Сообщений: 301
12.04.2013, 13:57  [ТС] 7
метод
C#
1
client.ChangeDirectory(info.TimeOut, dir);
запоминает директорию, и пытается открыть нужный каталог не там, где нужно.
Пример:
есть папки /logs и /www, после проверки каталога logs алгоритм открывает logs/www , а не /www, по этому нужно вычислить момент, когда нужно клиенту подняться на уровень вверх
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
12.04.2013, 14:49 8
Athlon_33_88, еще раз на те же грабли: вот точно такой же алгоритм, тоько ищет на компе, а не на ФТП. Где там кто куда поднимается на уровень выше? Покажите? Не нужно совать циклы в рекурсию, не нужно совать рекурсию в циклы, не мешайте одно с другим.
0
(x(x_(x_x(О_о)x_x)_x)x)
64 / 56 / 6
Регистрация: 04.09.2010
Сообщений: 301
12.04.2013, 21:30  [ТС] 9
Во всем разобрался, окончательный вариант метода:
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
        string FileSearch(string dir,string filename)
        {
               client.ChangeDirectory(info.TimeOut, dir);
        
                FtpItem[] items = client.GetDirectoryList(info.TimeOut * 100);
 
                string search_result = string.Empty;
                foreach (FtpItem item in items)
                {
                    if (item.ItemType == FtpItemType.File)
                    {
                        if (item.Name == filename)
                        {
                            search_result += client.GetWorkingDirectory(info.TimeOut) + "/" + filename + "\n";
                        }
                    }
                            
                    if (item.ItemType == FtpItemType.Directory)
                    {
                        var result = FileSearch(item.Name, filename);
                        if (result != string.Empty)
                        {
                            search_result += result;
                        }
                    }
                }
               client.ChangeDirectoryUp(info.TimeOut);
               return search_result;
        }
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
12.04.2013, 22:00 10
Бесполезно
Кликните здесь для просмотра всего текста
Вы уж лучше тогда блог заведите, а то у некоторых возникают мысли, что вы хотите послушать чье-то мнение, кроме своего
1
12.04.2013, 22:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2013, 22:00
Помогаю со студенческими работами здесь

Программа фтп-клиент скачивает файл с большим размером, чем он есть на фтп-сервере
Здравствуйте! Есть программа фтп-клиент, работает через консоль под Linux, после подключения к...

рекурсивный алгоритм
В общем я уже намучился с этим заданием... Дело такое, алгоритм составлен, но не совсем такой,...

Рекурсивный алгоритм
Ребят, подскажите,пожалуйста,в чём ошибка,не могу получить значения P(r)?

Рекурсивный алгоритм
Помогите написать код или обяснить..


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru