Wyszukiwanie i otwieranie PDF w aplikacji

0

Witam,

Mój program ma za zadanie wyszukiwać pliki pdf w folderze "C:\Archiwum" i otwierać je. Jednakże folder "Archiwum" ma X podfolderów. chciałbym wyszukiwać we wszystkich podfolderach za wyjątkiem "C:\archiwum\Stare". Niestety ni jak nie wiem jak to napisać a już prawie jestem na ukończeniu programu (gdyby były jakieś uwagi co do kodu, jego optymalizacji także proszę o info).

Pozdrawiam
Kamil

namespace przegladarka
{
    public partial class Form1 : Form
    {
        ResourceManager resources = new ResourceManager(typeof(Form1));
        AxAcroPDFLib.AxAcroPDF pdf = new AxAcroPDFLib.AxAcroPDF();
        string sPattern1 = @"^\w{3}-\w{2}-\w{2,3}$";
        string sPattern2 = @"^\w{3}-\w{2}-\w{2,3}_\w{3}$";
        string sPattern3 = @"^\d{4}-\d{3}$";
        string Choise = null;
        string FolderPath = @"H:/Archiwum/";

        public Form1()
        {
            InitializeComponent();
        }

        public void Search()
        {
            DirectoryInfo dir = new DirectoryInfo(FolderPath);
            FileInfo[] files = dir.GetFiles(Nazwa.Text + "*.pdf", SearchOption.AllDirectories);
            Lista.Items.Clear();
            if (files.Count() > 1)
            {
                Lista.Visible = true;
            }

            if (Lista.Items.Count == 0)
            {
                foreach (var item in files)
                {
                    Lista.Items.Add(item);
                }
            }
        }

        public void ReadPDF()
        {
            try
            {
                DirectoryInfo dir = new DirectoryInfo(FolderPath);
                FileInfo[] files = dir.GetFiles(Nazwa.Text + "*.pdf", SearchOption.AllDirectories);

                pdf.Dock = DockStyle.Fill;
                //pdf.Enabled = true;
                pdf.Location = new Point(0, 0);
                pdf.Name = "pdfReader";
                pdf.OcxState = ((AxHost.State)(resources.GetObject("pdfReader.OcxState")));
                //pdf.TabIndex = 0;                

                this.Controls.Add(pdf);
                if (Choise != null)
                {
                    pdf.LoadFile(files[0].DirectoryName + @"\" + Choise);
                }
                else
                {
                    pdf.LoadFile(files[0].DirectoryName + @"\" + files[0].ToString());
                }
                pdf.setView("Fit");
                pdf.Visible = true;
                
            }
            catch (Exception ex)
            {
                MessageBox.Show("Brak rysunku");
            }
        }

        private void Nazwa_KeyDown(object sender, KeyEventArgs e)
        {
            Search();
            if (e.KeyCode == Keys.Enter)
            {
                if (Regex.IsMatch(Nazwa.Text, sPattern1))
                {
                    ReadPDF();
                }
                else if (Regex.IsMatch(Nazwa.Text, sPattern2))
                {
                    ReadPDF();
                }
                else if (Regex.IsMatch(Nazwa.Text, sPattern3))
                {
                    ReadPDF();
                }
                else
                {
                    errorProvider1.SetError(Nazwa, "Zły format");
                }
            }
        }

        private void Nazwa_TextChanged(object sender, EventArgs e)
        {
            if (Regex.IsMatch(Nazwa.Text, sPattern1))
            {
                errorProvider1.Clear();
            }
            else if (Regex.IsMatch(Nazwa.Text, sPattern2))
            {
                errorProvider1.Clear();
            }
            else if (Regex.IsMatch(Nazwa.Text, sPattern3))
            {
                errorProvider1.Clear();
            }
            else
            {
                errorProvider1.SetError(Nazwa, "Zły format");
            }  
          
        }

        private void Lista_Click(object sender, EventArgs e)
        {
            try { 
            Choise = Lista.SelectedItem.ToString();
            ReadPDF();
                }
            catch { }
        }

        private void Lista_KeyDown(object sender, KeyEventArgs e)
        {
            this.Lista.Focus();
            this.Lista.Select();

            if (e.KeyCode == Keys.Up)
            {
                this.Lista.SelectedIndex++;
            }
            if (e.KeyCode == Keys.Down)
            {
                this.Lista.SelectedIndex--;
            }
        }
    }
}
```csharp

0

Dzięki za link jednak to wyszukuje ścieżkę
ja potrzebuje by przeszukiwało cały folder bez jednego czyli jak jest "SearchOption.AllDirectories" by można było wyłączyć jeden folder
czyli np. Except(c:\archiwum\stare) coś w ten deseń.

jest jakaś taka opcja czy coś ?

0

Tak, ta opcja nazywa sie if
Przed wejściem do drugiego foreacha daj:

if(d==TwójKatalog)
   continue;
0

dając :

 
            if (Lista.Items.Count == 0 && dir.GetDirectories().ToString()!=@"C:/Archiwum/Stare")
            {
                foreach (var item in files)
                {
                    Lista.Items.Add(item);
                }
            }

niestety dalej przeszukuje katalog :/

0

Pokaż całą metodę.
Po co to Lista.Items.Count == 0?
dir.GetDirectories().ToString() zwróci ścieżkę z \ a nie z / to ma znaczenie.

0

a więc...
Lista.Items.Count == 0 jest po to by mi się nie duplikowały dane na ListBox'ie
bo jak je wpisuje inna nazwę pdf to stare dane zostają.

a cały program wygląda następująco :

 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Resources;
using System.Text.RegularExpressions;



namespace przegladarka
{
    public partial class Form1 : Form
    {
        ResourceManager resources = new ResourceManager(typeof(Form1));
        AxAcroPDFLib.AxAcroPDF pdf = new AxAcroPDFLib.AxAcroPDF();
        string sPattern1 = @"^\w{3}-\w{2}-\w{2,3}$";
        string sPattern2 = @"^\w{3}-\w{2}-\w{2,3}_\w{3}$";
        string sPattern3 = @"^\d{4}-\d{3}$";
        string Choise = null;
        string FolderPath = @"C:/Archiwum/";
        string xFolderPath = @"C:/Archiwum/Stare";


        public Form1()
        {
            InitializeComponent();
        }

        public void Search()
        {
            DirectoryInfo dir = new DirectoryInfo(FolderPath);
            FileInfo[] files = dir.GetFiles(Nazwa.Text + "*.pdf", SearchOption.AllDirectories);
            Lista.Items.Clear();
            if (files.Count() > 1)
            {
                Lista.Visible = true;
            }
            else
            {
                Lista.Visible = false;
            }

            if (Lista.Items.Count == 0 && dir.GetDirectories().ToString()!=xFolderPath)
            {
                foreach (var item in files)
                {
                    Lista.Items.Add(item);
                }
            }
        }

        public void ReadPDF()
        {
            try
            {
                DirectoryInfo dir = new DirectoryInfo(FolderPath);
                FileInfo[] files = dir.GetFiles(Nazwa.Text + "*.pdf", SearchOption.AllDirectories);

                pdf.Dock = DockStyle.Fill;
                pdf.Enabled = true;
                pdf.Location = new Point(0, 0);
                pdf.Name = "pdfReader";
                pdf.OcxState = ((AxHost.State)(resources.GetObject("pdfReader.OcxState")));
                pdf.TabIndex = 0;                

                this.Controls.Add(pdf);
                if (Choise != null)
                {
                    pdf.LoadFile(files[0].DirectoryName + @"\" + Choise);
                }
                else
                {
                    pdf.LoadFile(files[0].DirectoryName + @"\" + files[0].ToString());
                }
                pdf.setView("Fit");
                pdf.Visible = true;

            }
            catch (Exception ex)
            {
                MessageBox.Show("Brak rysunku");
            }
        }

        private void Nazwa_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                pdf.Controls.Clear();
                Search();
                if (Regex.IsMatch(Nazwa.Text, sPattern1))
                {
                    //pdf.Controls.Clear();
                    ReadPDF();
                }
                else if (Regex.IsMatch(Nazwa.Text, sPattern2))
                {
                    //pdf.Controls.Clear();
                    ReadPDF();
                }
                else if (Regex.IsMatch(Nazwa.Text, sPattern3))
                {
                    //pdf.Controls.Clear();
                    ReadPDF();
                }
                else
                {
                    errorProvider1.SetError(Nazwa, "Zły format");
                }
            }
        }

        private void Nazwa_TextChanged(object sender, EventArgs e)
        {
            if (Regex.IsMatch(Nazwa.Text, sPattern1))
            {
                errorProvider1.Clear();
            }
            else if (Regex.IsMatch(Nazwa.Text, sPattern2))
            {
                errorProvider1.Clear();
            }
            else if (Regex.IsMatch(Nazwa.Text, sPattern3))
            {
                errorProvider1.Clear();
            }
            else
            {
                errorProvider1.SetError(Nazwa, "Zły format");
            }

        }

        private void Lista_Click(object sender, EventArgs e)
        {
            try
            {
                Choise = null;
                pdf.Controls.Clear();
                Choise = Lista.SelectedItem.ToString();
                ReadPDF();
            }
            catch { }
        }

        //private void Lista_KeyDown(object sender, KeyEventArgs e)
        //{
        //    this.Lista.Focus();
        //    this.Lista.Select();

        //    if (e.KeyCode == Keys.Up)
        //    {
        //        this.Lista.SelectedIndex++;
        //    }
        //    if (e.KeyCode == Keys.Down)
        //    {
        //        this.Lista.SelectedIndex--;
        //    }
        //}
    }
}
0

Ja tu nie widzę tej metody przeszukującej katalogi.

0

dir.GetDirectories().ToString() zwróci wam stringa: System.IO.DirectoryInfo[].

0

Ja znów z moim skryptem :-)

using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;
using System.IO;

class Script
{
    public static List<string> Lista = new List<string>();
    public static List<string> ExcludeList = new List<string>();
    public static string NazwaText = "";
    public static string FolderPath = "G:\\ebook-test";
    
    [STAThread]
    static public void Main(string[] args)
    {
        ExcludeList.Clear();
        ExcludeList.Add("G:\\ebook-test\\druki");
        //ExcludeList.Add("G:\\ebook-test\\forex"); // ten katalog przepusci
        ExcludeList.Add("G:\\ebook-test\\fuzzy_logic");
        Search();
        foreach(var line in Lista) 
        Console.WriteLine("{0}", line);
    }
    
        public static void Search()
        {
            DirectoryInfo dir = new DirectoryInfo(FolderPath);
            FileInfo[] files = dir.GetFiles(NazwaText + "*.pdf", SearchOption.AllDirectories);
            Lista.Clear();
                foreach (var item in files)
                {
                    if (! ExcludeList.Contains(item.DirectoryName))
                        Lista.Add(item.FullName);
                }
        }
}

wynik :

G:\ebook-test\forex\2FORECASTING FINANCIAL MARKETS USING NEURAL NETWORKS.PDF
G:\ebook-test\forex\Coders_Guru_Full_Course.pdf
G:\ebook-test\forex\Forex News to take the best economic decision.pdf
G:\ebook-test\forex\handel odwrotny.pdf

0

i napisałem program
działa przeszukiwanie
za co bardzo dziękuję Wam :)

jednak nie mogę sobie poradzić z kwestią
wyszukiwania.
Tzn. jak kliknę w button "wyszukaj" nie wyszukuje
bym mógł kodzić w visual 2013 tak by działało na XP musiałem się przerzucić na xamla i to mnie trochę zabiło
mógłby ktoś rzucić okiem do załącznika i pomóc mi naprawić błąd związany z przyciskiem "wyszukaj"
tak by jak wprowadzę jakiś numer z palca by po przyciśnięciu tego przycisku wyszukało (i uwzględniło checkboxa "wszystkie edycje") ?
Wiem, że moje pytania pewnie są laickie (za co bardzo przepraszam) ale dopiero się uczę programować a strasznie cisną w szkole...

Z góry dziękuję za pomoc

0

wyszło delikatne masło maślane

a więc jeszcze raz :)
program działa jeśli chodzi o starą wersje WindowsForm
Jednak by uruchomić go na XP byłem zmuszony przejść na c# xaml
program otwiera pdf'y
mam uruchomione przyciski poprzedni i następny (działają tzn. jak wyszukam pdf wpisane na sztywno pod "string NazwaText" to mogę przemieszczać się po liście)
niestety nie wiem jak zrobić tak by wpisać w textboxa jakąś nazwę i ją wyszukać po kliknięciu "wyszukaj"
oraz czy działa chceckbox który umożliwi wyszukiwanie w folderach "wykoluczonych" z pierwotnego wyszukiwania ?

0

Może miałeś problem z wersją .NET. Na XP maksymalnie można z tego co pamiętam zainstalować .NET 4, więc może wystarczyło zmienić wersje .NET w projekcie?
Co do samego projektu to ło bosze, rozpierdziel, gdzie nie kliknę to exception. :P

0

hmm...
mi to działa i nic nie wywala
(w sensie oprócz wyszukiwania po kliknięciu na "wyszukaj")

0

to w razie "w" zamieszczam jeszcze raz
na pewno działa
błędów nie wywala
jedynie nie działa to co pisałem wcześniej

0
<TextBox x:Name="TextBox" Height="23" TextWrapping="Wrap" Text="{Binding Text}" Width="120" AcceptsReturn="True" FontSize="14" HorizontalAlignment="Center" HorizontalContentAlignment="Center" TextChanged="TextBox_TextChanged"/>

W ViewModel

stirng text;
string Text {
      get {return text;}
      set
     {
          text = value;
          OnPropertyChanged("Text");
     }
}

I pod propertką Text masz to co się znajduje w textboxie, to już sobie chyba poradzisz z wyszukiwaniem, bo nie chce mi się dochodzić jak to wyszukiwanie działa.

0

mam nadzieję, że się uda :)
bo już mnie męczy ten program :(

0

Dodatkowo patrząc na drugi projekt który wrzuciłeś masz tam literówkę:

Command="{Binding SearchpPdfsCommand}"

a powinno być:

Command="{Binding SearchPdfsCommand}

A ta próba użycia wzorca MVVM to tak sam od siebie czy wymaganie narzucone odgórnie?

0

sam od siebie
lubię się uczyć
ale nie sądziłem, że aż tak mnie to przyciśnie i nie ogarnę
ale mam motywację i ukończę ten projekt
i inne aż do momentu gdy uznam, że opanowałem temat

1 użytkowników online, w tym zalogowanych: 0, gości: 1