按照列表C#的顺序转换文件

时间:2019-02-22 17:56:26

标签: c# arrays .net list converters

我需要将图像(例如.jpg)转换为PDF文件,以便进行学校作业。我有一个ListBox,在其中放置了PDF文件的页面,因此用户可以重新排序列表并按该顺序转换文件。 我将文件放在一个临时文件夹中,以便将文件转换为PDF。

我的问题是::如何按照用户选择的顺序转换文件?

我已经搜索过,并且尝试使用字符串IDName进行Class,因此我从ListBox中的项目获取ID并在新列表中对其进行更改。我想之后,我做了一个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 :(得分:0)

如果两个动作都在同一过程中发生,则只需将文件名列表存储在内存中(并且已经将它们添加到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),而后者至少对于说英语的人更具可读性。 / p>

我还注意到您的用户必须一个一个地选择文档,但是FileOpen对话框允许一次选择多个文件,我相信它也保留了选择的顺序。

如果选择顺序很重要,并且文件打开对话框没有保留顺序,或者用户发现难以遵循,则仍然可以使用多个文件选择打开对话框,然后允许对listimga列表框进行重新排序以获取订购权。