Конвертировать файлы в порядке следования списка C # - PullRequest
0 голосов
/ 22 февраля 2019

Мне нужно преобразовать изображения (например, .jpg) в файлы PDF для школьного задания.У меня есть ListBox, куда я помещаю страницы файла PDF, чтобы пользователь мог переупорядочить список и преобразовать файлы в указанном порядке.У меня есть файлы во временной папке, чтобы получить файлы для преобразования их в PDF.

Моя проблема здесь: как мне преобразовать файлы в том порядке, в котором пользовательвыбрал?

Я уже искал и пытался создать класс со строками ID и Name, поэтому я получил идентификатор из элемента в ListBox и изменил его в новом списке.И я думаю, что после этого я делаю цикл foreach (), где я получаю файлы из временной папки и объединяю их в новый файл PDF, но для того, чтобы сделать в том порядке, в котором я хочу, я думаю, что мне нужно сравнить имя файлас именем в списке и, если оно совпадает, преобразовать и добавить его, если нет, перейти к следующему файлу.Но я не знаю, как это сделать.

Может кто-нибудь помочь мне понять это правильно?Заранее спасибо!

Я отправляю свой код на:

   //the open files button
   private void proc2_Click(object sender, EventArgs e)
   {
        OpenFileDialog dialogo = new OpenFileDialog();

        dialogo.Title = "Search files";

        dialogo.InitialDirectory = @"E:\";

        dialogo.Filter = "Images (.bmp,.jpg,.png,.tiff,.tif) |*.bmp;*.jpg;*.png;*tiff;*tif|All of the files (*.*)|*.*";

        DialogResult resposta = dialogo.ShowDialog();
        if (resposta == DialogResult.OK)
        {
            string caminhoCompleto = dialogo.FileName;
            caminho2 = dialogo.SafeFileName;
            caminhotb2.Text = caminhoCompleto;
            string fish = "";
            string path = @"C:\temporario";
            if(Directory.Exists(path))
            {
                 fish=Path.Combine(path, caminho2);                   
            }
            else
            {
                Directory.CreateDirectory(path);
                fish = Path.Combine(path, caminho2);
            }
            File.Create(fish);
            listaimg.Items.Add(caminho2);
        }
    }

    public string[] GetFilesImg4() //jpg files
    {
        if (!Directory.Exists(@"C:\temporario"))
        {
            Directory.CreateDirectory(@"C:\temporario");
        }
        DirectoryInfo dirInfo = new DirectoryInfo(@"C:\temporario");
        FileInfo[] fileInfos4 = dirInfo.GetFiles("*.jpg");
        foreach (FileInfo info in fileInfos4)
        {
            if (info.Name.IndexOf("protected") == -1)
                list4.Add(info.FullName);
        }

        return (string[])list4.ToArray(typeof(string));
    }

1 Ответ

0 голосов
/ 22 февраля 2019

Если оба действия происходят в одном и том же процессе, вы можете просто сохранить список имен файлов в памяти (и вы уже добавили их в listaimg):

public string[] GetFilesImg4() //jpg files
{
    string tempPath = @"C:\temporario";
    if (!Directory.Exists(tempPath))
    {
        foreach (string filename in listimga.Items)
        {
            if (!filename.Contains("protected"))
                list4.Add(Path.Combine(tempPath, filename);
        }
    }

    return (string[])list4.ToArray(typeof(string));
}

, если это разные процессытогда вы можете просто сбросить содержимое вашего listimga в какой-то момент и затем прочитать его из того же файла.В приведенном ниже примере я сохраняю его в файле с именем "order.txt" в том же каталоге, но логика может быть более сложной, например, объединение нескольких файлов с отметкой времени и т. Д.

// somewhere in after selecting all files
File.WriteAllLines(@"c:\temporario\order.txt", listimga.Items.Select(t=>t.ToString()));


public string[] GetFilesImg4() //jpg files
{
    string tempPath = @"C:\temporario";
    if (!Directory.Exists(tempPath))
    {
        var orderedFilenames = File.ReadAllLines(Path.Combine(tempPath, "order.txt")); // list of files loaded in order
        foreach (string filename in orderedFilenames)
        {
            if (!filename.Contains("protected"))
                list4.Add(Path.Combine(tempPath, filename);
        }
    }

    return (string[])list4.ToArray(typeof(string));
}

это такжеХорошая идея - изучить доступный метод в классе, например, в этом случае string.IndexOf(s) == -1 эквивалентно !string.Contains(s), а последний гораздо удобнее для чтения, по крайней мере, для англоговорящего человека.

Я также заметил, что вашпользователи должны выбирать документы один за другим, но диалоги FileOpen позволяют выбирать несколько файлов одновременно, и я считаю, что это также сохраняет порядок выбора.

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

...