파일이름으로 파일 찾는 알고리즘

aw2310의 이미지

컴퓨터 프로그래밍 알고리즘에 관한 질문입니다.
처음에는 그냥 단순한 Tree로 생각했는데.. 하다보니까 어렵네요..
질문하기 좀 부끄럽기도 합니다.

상황은 이렇습니다.

루트 디렉토리에서 부터 시작해서 주어진 이름의 파일을 찾는 프로그램을 만든다고 가정하면...

어떻게 해야할지요?

 디렉토리 = 루트 디렉토리;
 while(1) {
   디렉토리->자기디렉토리에서 찾기
   
   if 찾으면
      break;
   else  { // 못찾으면
       for (i=0 ; i < n; i++) {   // n은 자기 밑의 디렉토리 수
           디렉토리 = 디렉토리[i]
           디렉토리-> 자기디렉토리에서 찾기
           if 찾으면 
              break;
           else {
              for (i=0 ; i < n ; i++) {
                  ....
              }
              .....
           }
       }
   }
 }

재귀호출을 써야되는가요? 음...

언뜻보면 간단한것 같은데... 구현할려고 하다보니 막히네요..
나.. 바본가봐.. 흑흑.. (T T)

ageldama의 이미지

재귀로 간단히 해결하실 수 있을 것 같다면 재귀로 해보세요.
그리고 그 다음에 루프로 바꾸시던지 하시는게 더 좋을 것 같습니다.

(파일이면 매칭 되는지, 디렉이면 재귀... 그러면 좌악 모을 수 있겠죠?;; )

----
The future is here. It's just not widely distributed yet.
- William Gibson

jinoos의 이미지

ageldama wrote:
재귀로 간단히 해결하실 수 있을 것 같다면 재귀로 해보세요.
그리고 그 다음에 루프로 바꾸시던지 하시는게 더 좋을 것 같습니다.

(파일이면 매칭 되는지, 디렉이면 재귀... 그러면 좌악 모을 수 있겠죠?;; )

man ftw, man fts

목적을 찾아서... jiNoos

aw2310의 이미지

재귀를 쓰면 않될것 같네요..

traverse 하는 것도 아니고...
원하는 것만 찾는건데.. 재귀로 하면 찾고나서 return 할때 어디로 return?

음... 않되겠네.. 책좀 찾아봐야지...

간만에 자료구조 나오니까 헷갈리네요..

맨날 짜집기만 하다가 좀 색다른게 나오니 헛갈립니다.. 바보같이.. (T T)

ddt의 이미지

aw2310 wrote:

원하는 것만 찾는건데.. 재귀로 하면 찾고나서 return 할때 어디로 return?

함수 반환값을 파일 이름으로 하세요.

String findFile(String dirName, String fileName) {
    childs = dirName아래에 있는 파일 목록;
    ......
    if fileName을 찾았으면 {
         return childs[i];
    }
    ......
    if childs[i]가 디렉토리이면 {
         return findFile(childs[i], fileName); // findFile에서 return한 값을 return.
    }
    ......
}
System.out.println(findFile("/", "foo"));
정태영의 이미지

aw2310 wrote:
재귀를 쓰면 않될것 같네요..

traverse 하는 것도 아니고...
원하는 것만 찾는건데.. 재귀로 하면 찾고나서 return 할때 어디로 return?

음... 않되겠네.. 책좀 찾아봐야지...

간만에 자료구조 나오니까 헷갈리네요..

맨날 짜집기만 하다가 좀 색다른게 나오니 헛갈립니다.. 바보같이.. (T T)

que에다가.. 경로/파일이름을.. 죽 넣고..
그 que 의 head를.. 리턴하면 되죠..

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

FruitsCandy의 이미지

재귀를 쓰면 않될것 같네요.. 

traverse 하는 것도 아니고... 
원하는 것만 찾는건데.. 재귀로 하면 찾고나서 return 할때 어디로 return? 

결론 부터 말씀드리면 재귀 써도 됩니다.

return은 굳이 해줄 필요가 없고요.

주어진 파일 찾을시에 pintf로 파일 있는 경로만 찍어주시면

원하는 결과가 아닐지요.

DIR , stat 구초체를 찾아보시길 바랍니다.

예전에 책보며 find 짰던게 있네요

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <unistd.h>

#define MAX_FILE_NAME 256
#define MAX_PATH_NAME 4096

static char findname[MAX_PATH_NAME];
static void search_dir(char *);

int main(int argc, char * argv[])
{
        int count_filename ;
        if(argc != 3)
        {
                printf("Usage : file_find [file name] [start path] \n");
                return ;
        }

        count_filename = strlen(argv[1]);
        strncpy(findname,argv[1],count_filename);

//      printf("find ! : %s\n",findname);
        search_dir(argv[2]);

        return ;
}

static void search_dir(char * path)
{
//      printf("넘어온 파일 : %s\n",path);
        char new_file[MAX_PATH_NAME];
        struct stat stat_buf;
        struct dirent * dirent_buf;
        DIR * ptr_dir;
        int count_filename;
    int strlen_count;
        strlen_count = strlen(path);

//검색할 파일에서 '/' 을 찾는다
        for(strlen; strlen_count > 0 ;strlen_count--)
        {
//              printf("파싱할 파일 : %c\n",path+strlen_count);
                if( *(path+strlen_count) == '/')
                        break;
        }
//'/' 다음을 읽어서 찾는 파일인지 검사

//      printf("파일 검사 : %s\n",path+ strlen_count +1);
        if( strcmp(path + strlen_count + 1,findname) == 0)
                printf("Find That : %s\n",path);

//파일이 디렉토리인지 검사 , 디렉토리가 아니면 끝, 디렉토리면 계속
        if(lstat(path,&stat_buf) < 0)
        {
                printf("lstat error %s\n",path);
                return ;
        }

        if(S_ISDIR(stat_buf.st_mode) == 0 )
        {
        //      printf("This is not directory\n");
                return ;
        }
        else
        {
        //      printf("This is directory\n");
        }
        if((ptr_dir = opendir(path)) == NULL)
        {
                printf("opendir error\n");
                return ;
        }
//디렉토리 파일을 읽는다 search_dir을 재귀 호출
        while( (dirent_buf = readdir(ptr_dir)) != NULL)
        {
                if(strcmp(dirent_buf->d_name,".") == 0 || strcmp(dirent_buf->d_name,"..") == 0)
                        continue;
                // '/'가 있으면 그대로 '/'가 없으면 넣어준다
                memset(new_file,0x00,sizeof(new_file));
                count_filename = strlen(path);
                if(*(path+count_filename -1) == '/')
                {
                        sprintf(new_file,"%s%s",path,dirent_buf->d_name);
                }
                else
                {
                        sprintf(new_file,"%s/%s",path,dirent_buf->d_name);
                }
        //      printf("찾을 파일 : %s\n",new_file);
                search_dir(new_file);

        }
        closedir(ptr_dir);
}

아지랑이류 초환상 공콤 화랑... 포기하다.. T.T

이한길의 이미지

스텍에 푸쉬~ 해서 돌려주고 받은넘에 또 푸쉬해서 돌려주고..
이렇게 하면 괜찮지 않을라나요?

----
먼저 알게 된 것을 알려주는 것은 즐거운 일이다!
http://hangulee.springnote.com
http://hangulee.egloos.com

aw2310의 이미지

무사히 잘 해결했습니다..

재귀함수를 사용했고...
전역변수를 몇개 사용해서 찾은것을 저장하고 찾았다는 플래그를
사용해서 전체를 찾지 않게끔 구현했습니다.

디렉토리에서 파일 찾는 것이라고 여쭤봤지만 사실 다른 도메인이었거든요.

암튼.. 도움 많이 됐습니다.. 감사합니다... 꾸벅...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.