2011-07-29 4 views
0

誰かが助けることができるかどうか疑問に思っています。私は、ユーザー名に基づいて特定のディレクトリから複数のファイルを取得する次のコードを取得しています。私はファイルを返すだけです。 xls、.xlsx、または.pdf形式です。ファイル名にユーザ名が含まれています。ユーザ名の最初の文字がファイル名の最初の文字と等しいこと。ファイル名はデリミタの前のユーザ名と正確に一致しています。区切り文字の前にユーザー名が付いているファイルと一致するC#

最終的なビットは私が苦労しているところです。私は現在持っているコードは、次のファイルに戻ります:v_ashby-smith_2010_testtesttesttest.xlsx、v_ashby-smith_2011_testtesttesttest.xls、

は、しかし、私はそれがこのファイルとしてファイルv_ashby-smithson_2010_testtesttesttest.xlsを返却する必要はありませんv_ashby-smithson_2010_testtesttesttest.xlsをユーザー名(v_ashby-smith)とまったく同じではありません。私は、例えば、XXのような区切り記号の前にユーザー名に合ったファイルを手に入れた人について考えました。何か案は?

public FileInfo[] ReadFiles(String userName) 
{ 
    DirectoryInfo bonusInfoDirectory = null; 
    FileInfo[] files = null; 

    try 
    { 
    string userNameFirstLetter = userName.First().ToString(); 
    string directoryPath = System.Configuration.ConfigurationManager.AppSettings["DirectoryPath"]; 
    bonusInfoDirectory = new DirectoryInfo(directoryPath); 
    files = bonusInfoDirectory.GetFiles().Where(f => f.Extension == ".xls" || 
     f.Extension == ".xlsx" || f.Extension == ".pdf") 
     .Where(f => f.Name.Contains(userName)) 
     .Where(f => f.Name.First().ToString() == userNameFirstLetter) 
     .OrderByDescending(f => f.Name).ToArray(); 
    } 
    catch (DirectoryNotFoundException exp) 
    { 
    throw new DirectoryNotFoundException("Directory not found " + exp.Message); 
    } 
    catch (IOException exp) 
    { 
    throw new IOException("The Process cannot access the file because it is in use by 
    another process " + exp.Message); 
    } 
    return files; 
} 
+0

あなたのファイル名で判断すると、(ユーザー名の開始インデックス+ユーザー名の長さの)インデックスを使用してWhere句を追加できませんでしたし、そのインデックスのcharが区切り文字かどうかを確認できませんでしたか?この場合、 "_" => ex:.Where(f => f [f.Name.IndexOf(userName)+ username)のように見えます。長さ(多分+1)] == [区切り文字として] –

+0

私はそれを考えていませんでした。ちょうど遊んで私は別のソリューションをスプリットを使用している可能性がありますと思う。したがって.Where(f => f.Name.Split(Convert.ToChar( 'X')[0] .Equals(userName)) –

答えて

0

一つのアプローチは、正規表現を使用することで置き換えることになります。

.Where(f => f.Name.Contains(userName)) 

.Where(f=>Regex.IsMatch(
     f.Name, 
     String.Format(
       @"(?:\b|\d){0}(?:\b|\d)", 
       Regex.Escape(userName) 
     ) 
    ) 

で(System.Text.RegularExpressionsを含める)

IsMatch trueを返しますファイル名の直前または直後にユーザー名が含まれている場合は、単語区切り(sy mbol、スペース、文字列の開始、文字列の終わり)または数値。あなたのファイル名に基づいて

1

- あなたの説明に基づいて

string seperator = "_"; 
    string filespec = String.Format("{0}{1}*", userName, seperator); 
    files = bonusInfoDirectory.GetFiles(filespec) 
    .Where(f => f.Extension == ".xls" || 
       f.Extension == ".xlsx" || 
       f.Extension == ".pdf") 
    .OrderByDescending(f => f.Name).ToArray(); 

string filespec = String.Format("{0}*", userNameFileLetter); 
    string seperator = "_"; 
    string pattern = String.Format("{0}{1}", userName, seperator); 
    files = bonusInfoDirectory.GetFiles(filespec) 
    .Where(f => f.Extension == ".xls" || 
       f.Extension == ".xlsx" || 
       f.Extension == ".pdf") 
    .Where(f->f.Name.Contains(pattern)) 
    .OrderByDescending(f => f.Name).ToArray(); 

しかし、あなたは、ユーザーv_ashby・スミスとvv_ashby・スミスと呼ばれる別のものを持っているならば、かつて、注意しても、後者のファイルを取得します。

0

レガシー制約なしでこれをゼロから設計する場合は、現在の実装で衝突を取得するために、ファイル名にユーザー名の代わりに一意の識別子を使用します。また、区切り文字を使用してIDの特定の境界を作成できるので、コードを単純化できます。ファイルを人間が読めるようにする必要がある場合は、IDの区切り文字の外側にユーザ​​ー名を追加することもできます。

1923_V_Ashby_Smith.xmlユーザーのための1923 = user_idは:

はこのような何かを考えてみてください。

は.Split(「_」)を行うと、あなたがユーザーを識別するためのユニークな方法を持っていない場合USER_IDさんは、一意であるように設計されているので、これが機能する[0]

でユーザーIDを持っていますこの実装を検討する前に、設計についてもう少しバックアップして考える必要があります。

関連する問題