Проблема с передачей параметра классу в C # - PullRequest
0 голосов
/ 23 июня 2010

У меня проблемы с передачей этого параметра классу, который у меня есть. У кого-нибудь есть идеи?

Код класса 1:

public void DriveRecursion(string retPath)
{
    //recurse through files.  Let user press 'ok' to move onto next step        
    // string[] files = Directory.GetFiles(retPath, "*.*", SearchOption.AllDirectories);

    string pattern = " *[\\~#%&*{}/<>?|\"-]+ *";
    //string replacement = "";
    Regex regEx = new Regex(pattern);

    string[] fileDrive = Directory.GetFiles(retPath, "*.*", SearchOption.AllDirectories);
    List<string> filePath = new List<string>();



    dataGridView1.Rows.Clear();
    try
    {
        foreach (string fileNames in fileDrive)
        {

            if (regEx.IsMatch(fileNames))
            {
                string fileNameOnly = Path.GetFileName(fileNames);
                string pathOnly = Path.GetDirectoryName(fileNames);

                DataGridViewRow dgr = new DataGridViewRow();
                filePath.Add(fileNames);
                dgr.CreateCells(dataGridView1);
                dgr.Cells[0].Value = pathOnly;
                dgr.Cells[1].Value = fileNameOnly;
                dataGridView1.Rows.Add(dgr);

                 \\I want to pass fileNames to my FileCleanup Method
                 \\I tried this:
               \\SanitizeFileNames sf = new SanitizeFileNames();
               \\sf.Add(fileNames); <-- this always gets an error..plus it is not an action i could find in intellisense


            }

            else
            {
                continue;
            }

        }
    }
    catch (Exception e)
    {
        StreamWriter sw = new StreamWriter(retPath + "ErrorLog.txt");
        sw.Write(e);

    }
}

Код класса 2:

public class SanitizeFileNames
{

    public void FileCleanup(string fileNames)
    {
        string regPattern = " *[\\~#%&*{}/<>?|\"-]+ *";
        string replacement = "";
        Regex regExPattern = new Regex(regPattern);
    }

Что я хочу сделать в SanitizeFileNames - это выполнить foreach через FileNames & FilePath и заменить недопустимые символы (как определено в моем шаблоне Regex). Итак, что-то вроде этого:

using (StreamWriter sw = new StreamWriter(@"S:\File_Renames.txt"))
{
    //Sanitize and remove invalid chars  
    foreach (string Files2 in filePath)
    {
        try
        {
            string filenameOnly = Path.GetFileName(Files2);
            string pathOnly = Path.GetDirectoryName(Files2);
            string sanitizedFilename = regEx.Replace(filenameOnly, replacement);
            string sanitized = Path.Combine(pathOnly, sanitizedFilename);
            sw.Write(sanitized + "\r\n");
            System.IO.File.Move(Files2, sanitized);
        }
        //error logging
        catch(Exception ex)
        {
            StreamWriter sw2 = new StreamWriter(@"S:\Error_Log.txt");
            sw2.Write("ERROR LOG");
            sw2.WriteLine(DateTime.Now.ToString() + ex + "\r\n");
            sw2.Flush();
            sw2.Close();
        }
    }
}

Однако у меня проблемы с передачей fileNames в мой класс SanitizeFileNames. Кто-нибудь может мне помочь?

Ответы [ 4 ]

3 голосов
/ 23 июня 2010
  dataGridView1.Rows.Clear();
        try
        {
            foreach (string fileNames in fileDrive)
            {

                if (regEx.IsMatch(fileNames))
                {
                    string fileNameOnly = Path.GetFileName(fileNames);
                    string pathOnly = Path.GetDirectoryName(fileNames);

                    DataGridViewRow dgr = new DataGridViewRow();
                    filePath.Add(fileNames);
                    dgr.CreateCells(dataGridView1);
                    dgr.Cells[0].Value = pathOnly;
                    dgr.Cells[1].Value = fileNameOnly;
                    dataGridView1.Rows.Add(dgr);

                    new SanitizeFileNames().FileCleanup(fileNames);
                }

                else
                {
                    continue;
                }

            }
        }
1 голос
/ 23 июня 2010
  1. Вы можете создать статический класс третьего класса и добавить в качестве примера статическую переменную, называемую файлами «public static List<string> Files= new List<string>()».
  2. При создании файлов добавляйте те же файлы в статическую переменную.
  3. При очистке цикла файлов выведите статическую переменную и в конце очистите ее.
1 голос
/ 23 июня 2010

Полагаю, вы хотите передать грязное имя в функцию FileCleanup и очистить его.Вот как вы можете это сделать:

public String FileCleanup(string fileNames)
{
    string regPattern = " *[\\~#%&*{}/<>?|\"-]+ *";
    string replacement = "";
    Regex regExPattern = new Regex(regPattern);

    ...

    return cleanName;
}

и использовать его в своем коде следующим образом:

String cleanName = new SanitizeFileNames().FileCleanup(fileNames);

там, где вы положили комментарий.

1 голос
/ 23 июня 2010

Тип параметра должен быть перечисляемой коллекцией некоторого вида: список или массив. Кроме того, строки являются неизменяемыми, поэтому вы можете вернуть список очищенных имен файлов:

public class SanitizeFilenames
{
    public List<string> FileCleanUp(IEnumerable<string> filenames)
    {
        var cleanedFileNames = new List<string>();

        var invalidChars = Path.GetInvalidFileNameChars();
        foreach(string file in filenames)
        {
            if(file.IndexOfAny(invalidChars) != -1)
            {
                // clean the file name and add it to the cleanedFileNames list
            }
            else 
            {
                // nothing to clean here
                cleanedFileNames.Add(file);
            }
        }

        return cleanedFileNames;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...