2015-01-13 5 views
0

파일 이름 목록을 서버에서 가져 와서 저장하는 코드를 만들었습니다. 컴퓨터의 디렉토리에서 폴더 이름을 얻었으므로 둘 다 비교해야합니다. 서버가 아닌 로컬 시스템에있는 이름이 있는지 알아보십시오.파일 이름 변수를 파일 경로 변수와 비교하십시오.

serverlistarray에는 서버의 폴더 목록 (항목 당 1 개의 폴더)이 포함되어 있으며 로컬 listarray에는 로컬 컴퓨터의 디렉토리 목록이 포함되어 있으며 항목 당 1 개의 폴더가 있습니다.

String[] localfilelistarray = System.IO.Directory.GetDirectories(/*file location*/); 

내 문제는 get 디렉토리에 있으며 필자는 비교할 수없는 파일의 전체 경로를 포함합니다. 아래 코드는 내가 시도한 것이며 locallistarray의 파일에 대한 serverlistarray를 확인하고 일치하면 목록에 넣습니다.

for (int b = 0; b < localfilelistarray.Length; b++) 
{ 
    //problem with the compare 
    if (!serverlistarray.Contains(localfilelistarray[b].Replace(/*file path before filename*/, ""))) 
    { 
    //add to list variable 
    } 
} 

그때 (파일 이름을 보여 지금은 메시지 상자) 목록에서 모든 것을 내가하고 싶은 일을하기 위해이 코드를 사용합니다.

for (int f = 0; f < delete.Count(); f++) 
{ 
    MessageBox.Show(/*list variable*/); 
} 

그러나 서버 목록 배열에 있어도 모든 파일을 가져오고 잘못된 점을 해결할 수 있습니다. 그 두 배열의 비교로 할 수 있다고 생각하지만 루프에 메시지 상자를 넣을 때 예상대로 나오지 만 비교가되지 않는 것 같습니다.

누구나 무슨 일이 잘못되었는지 볼 수 있습니까?

ive는 대체 및 직접 비교를 사용하여 사용하지 못했습니다. 비록 serverillarray에 파일 경로를 추가하지만 서버 작업과이 코드의 다른 부분에 원시 파일 이름이 필요하므로이 작업을 수행 할 수 없습니다.

EDIT :

serverlistarray 예 :

[0]folder1 
[1]folder2 
[2]folder3 

localfilearray 예 :

[0]c:\\users\Noliver\folder1 
[1]c:\\users\Noliver\folder2 
[2]c:\\users\Noliver\folder3 
[3]c:\\users\Noliver\folder4 
[4]c:\\users\Noliver\folder5 

기대 출력 (루프에서 메시지 박스)

c:\\users\Noliver\folder4 
& 
c:\\users\Noliver\folder5 

EDIT 2 :

필자 파일 경로 사용없이 소량이 코드 노력이 발 출력 (연장은 박리와 파일 이름)를 serverlistarray이 온도 [0]으로부터 파일 이름을 함유하는 것으로 나타났다

for (int b = 0; b < localfilelistarray.Length; b++) 
{ 
    String[] temp = System.IO.Path.GetFileName(localfilelistarray[b]).Split('.'); 
    MessageBox.Show(localfilelistarray[b] + " - " + temp[0]); 
    for (int t = 0; t < serverlistarray.Length;t++) 
    { 
    MessageBox.Show("server " + serverlistarray[t] + " - " + localfilelistarray[b] + " - " + temp[0]); 
    } 
    if (!update.Contains(temp[0])) 
    { 
    delete.Add(localfilelistarray[b]); 
    } 
} 

을 그러나 모든 파일은 목록 변수에있었습니다. 이것은 새로운 줄이나 줄의 끝에있는 공간으로 내려갈 수 있습니까? 어떤 이유로 배열이 값을 포함하고 있는지 검사하는 if 문은 작동하지 않습니다.

+0

localfilelistarray 및 serverlistarray의 내용에 대한 예뿐만 아니라 결과로 기대되는 것을 제공 할 수 있습니까? – Patrick

+0

@ 패트릭이 형식과 예상 출력으로 코드를 업데이트했습니다. – NoLiver92

+0

Path.GetFileName을 사용하여 디렉토리를 제거 할 수 있습니다 (폴더와 파일에서 작동). 또한 몇 가지 임시 변수를 소개하여 비교 대상을 볼 수 있습니다. –

답변

0

문자열이 저장된 방식에서 가장 깊은 폴더 이름은 마치 파일 이름 인 것처럼 작성되었습니다. 그래서 나는 그것을 추출하기 위해 Path.GetFileName을 사용했다.

localfilearray.Where(x => !serverlistarray.Contains(x.Split('\\').Last())) 

당신이 지금 가지고있는, 당신이 할 수있는 것과 위의 코드를 사용하려면 :

localfilearray.Where(x => !serverlistarray.Contains(Path.GetFileName(x))) 

이 작품뿐만 아니라 사건의 대부분에, 당신은 이전의 이름을 좋아하지 않는 경우

  1. 삭제하는 것을 포함하는 기존 delete 목록을 확장 :

    delete.AddRange(localfilearray.Where(x => !serverlistarray.Contains(x.Split('\\').Last()))); 
    
  2. 또는, 단지 다음과 같이 선언 :

    var delete = new List(localfilearray.Where(x => !serverlistarray.Contains(x.Split('\\').Last())));` 
    
내가 디렉토리의 이름을 얻을 수 DirectoryInfo를 사용하는 대신, 등 "\"에 분할에 대해 조언을 줄
+0

나는 이것을 이미 가지고있는 것과 함께 사용하는 방법을 잘 모르겠습니다. – NoLiver92

+0

@ NoLiver92 : 이것은 귀하의 질문에 대한 전체 for 루프를 대체합니다. 기본적으로리스트를'var list = localfilearray.Where (x =>! serverlistarray.Contains (Path.GetFileName (x))) '로 대체 할 수 있습니다 .. ToArray()' – Patrick

0

:

var directoryInfo = new DirectoryInfo(@"c:\MyDir"); 
String directoryName = directoryInfo.Name; // returns "MyDir" 
관련 문제