Čtvrtek srpen 13, 2009

imagecreatefromjpeg() recoverable error: Premature end of JPEG file

· rubrika Clanky · kategorie

Pokud pracujete s knihovnou GD, mohlo by se vám stát, že narazíte na chybovou hlášku:

imagecreatefromjpeg() recoverable error: Premature end of JPEG file

Naštěstí lze tuto chybou hlášku obejít pomocí nastavení ini souboru, kdy je chyba ignorována a vesele se pokračuje dále. V PHP kódu (lze nastavit i přímo v ini souboru, ale k němu mnohdy není umožněn přístup) se tato možnost nastaví následovně:

ini_set(’gd.jpeg_ignore_warning’, 1);

16:19 — Komentář Stálý odkaz



Úterý duben 28, 2009

PHP třída pro tvorbu webových formulářů

· rubrika Clanky · kategorie

Pokud náhodou hledáte v PHP třídu pro jednoduchou a rychlou tvorbu formulářů, zkuste třídu Form. Je šířena pod GNU licencí, takže si ji v případě nutnosti můžete upravit.

17:38 — Komentář Stálý odkaz



Úterý březen 31, 2009

Zpropadený Firefox aneb synchronizace u XMLHttpRequest

· rubrika Clanky · kategorie

Je tomu teprve pár týdnů, kdy jsem se začal věnovat AJAXu, protože jsem ho potřeboval použít v mé diplomové práci. V ní jsem potřeboval zavolat jeden skript a po jeho dokončení ho znovu zavolat, jen s jinými parametry. Výsledky běhu skriptu (tzn. proběhlo to ok, nastala nějaká chyba), jsem chtěl zobrazovat do různých objektů na XHTML stránce. Napsal jsem si tedy tři funkce na práci s XMLHttpRequest, kde jsem v jedné z nich použil následující kód:
xmlhttp.open("GET",url,false);
Třetí parametr metody open říká, zda se má čekat na odpověď či nikoliv tzn. zda se použije synchroní nebo asynchroní mód.

Celé to funguje tak, že při synchroním přenosu, dojde k vytvoření nového vlákna přičemž původní je pozastaveno (tzn. je pozastavena veškerá interaktivita na straně klienta). V nově vytvořeném vláknu dojde k vyřízení požadavku a po jeho skončení se opět aktivuje vlákno původní a to zpracuje získaný výsledek. V druhém případě se nové vlákno nevytváří a uživatel tak může klidně dále využívat interaktivních stránek a po dokončení požadavku, je jeho výsledek zpracován.

Vše fungovalo dobře v Opeře 9.64, tak jsem to vyzkoušel i v IE 8 a následně ve Firefoxu 3.0.8. Jak jsem překvapivě zjistil, v mé nynější (a nejnovější) verzi Firefoxu synchroní přenos nefunguje (na internetu jsem se po té našel informace o nějakém bugu, ale už nevím kde ) a já potřeboval aby to fungovalo ve všech nejpoužívanějších prohlížečích.

Druhou metodou lze poslat více požadavků najednou a současně čekat na jejich vyřízení. Tuto variantu jsem nechtěl použít z důvodu toho, že skript na který se odkazuji exportuje data z databáze a importuje do jiné. Mnohdy jde i o statisíce záznamů a tak jsem nechtěl server moc zatěžovat vícenásobným spuštěním skriptu. Bohužel jsem po několika hodinách dospěl k názoru, že je to jediné možné řešení.

Pokud například chceme výsledky zobrazovat v různých objektech na (X)HTML stránce, tak jako já v diplomce, stačí k tomu použít třídu v JavaScriptu, kde si dokážeme uchovat jednotlivé instance XMLHttpRequestu a id objektu (bez použití třídy by jsme o ně přišli). Napsal jsem si tak vlastní třídu, kterou můžete najít níže. Předem bych chtěl schovívavost ke kódu. Vím, že mnou napsaná třída nesplňuje požadavky na znovupoužitelnost, až budu mít více času upravím ji

Zdrojový kód:

  1. /**
  2.  * Trida pro vykonavani Http pozadavku (AJAX)
  3.  */
  4.  function HttpClient() { } // HTTPCLIENT CLASS
  5.  HttpClient.prototype = {
  6.   // GET nebo POST
  7.   request_type:'GET',
  8.   // synchroni a nebo asynchroni pozadavek (synchroni nefunguje ve firefoxu 3 neco )
  9.   request_async:true,
  10.   // instance
  11.   xmlhttp:false,
  12.   //kde se zobrazi vysledek
  13.   where_show_content:'',
  14.  
  15.   // inicializace -> vytvoreni XMLHttpRequest
  16.   init:function() {
  17.     try {
  18.       // Mozilla / Opera / Safari
  19.       this.xmlhttp = new XMLHttpRequest();
  20.     }
  21.     catch (e){
  22.       // IE (snad vsechny nejpouzivanejsi verze)
  23.       var MSXML = new Array('MSXML2.XMLHTTP.5.0',
  24.          'MSXML2.XMLHTTP.4.0',
  25.          'MSXML2.XMLHTTP.3.0',
  26.          'MSXML2.XMLHTTP',
  27.          'Microsoft.XMLHTTP');
  28.       var ok = false;
  29.       for (var i=0;i < MSXML.length && !ok; i++){
  30.         try {
  31.           this.xmlhttp = new ActiveXObject(XMLHTTP_IDS[i]);
  32.           success = true;
  33.         }
  34.         catch (e){}
  35.       }
  36.       if (!success){
  37.         alert('Váš prohlížeč napodporuje AJAX!');
  38.       }
  39.     }
  40.   },
  41.   
  42.   //provedeni pozadavku
  43.   request: function(url){
  44.     if (!this.xmlhttp){
  45.       this.init();
  46.     }
  47.     this.xmlhttp.open(this.request_type,url,this.async);
  48.     this.xmlhttp.send(null); //pro posilani POST pozadavku
  49.    
  50.     //zobrazení loadingu
  51.     document.getElementById(this.where_show_content).innerHTML = '<img src=\"images/loading.gif\" alt="" />';
  52.    
  53.     //zpristupneni this ve funkci
  54.     var self = this;
  55.     this.xmlhttp.onreadystatechange = function(){
  56.       switch(self.xmlhttp.readyState) {
  57.       case 0:
  58.         break;
  59.       case 1:
  60.         break;
  61.       case 2:
  62.         break;
  63.       case 3:
  64.         break;
  65.       case 4:
  66.         if (self.xmlhttp.status == 200) {
  67.           document.getElementById(self.where_show_content).innerHTML = self.xmlhttp.responseText;
  68.         }else {
  69.           alert('HTTP Chyba při vykonávání dotazu: ' + '[' + self.xmlhttp.status + ']' + ' ' + self.xmlhttp.statusText);
  70.         }
  71.         break;
  72.       }
  73.     }
  74.   }
  75.  }
  76.  
  77. /**
  78. * ukazka volani tridy
  79. */
  80. var client = new HttpClient();
  81. client.async = true; //asynchroni mod
  82. client.where_show_content = 'main-box'; //kde zobrazit vysledek
  83. client.request('localhost/diplomka?pg=ajax'); //url pozadavku

20:00 — Komentář Stálý odkaz



Čtvrtek únor 26, 2009

PHP Funkce pro načtení jednoho řádku ze souboru

· rubrika Clanky · kategorie

Už jsem se mnohokrát setkal s tím, že jsem potřeboval číst data ze souboru po jednotlivých řádcích. Všimnul jsem si také, že mnoho lidí v různých diskuzích se ptá, jak číst ze souboru po jednotlivých řádcích, proto bych se chtěl s Váma podělit o moji funkci, kterou jsem si na to napsal. Funkce rozlišuje tři možné ukončení řádků a lze ji použít i na velké soubory!

Zdrojový kód:

  1. <?php
  2. function getLine($file) {
  3.  
  4.    while (!feof($file)) {
  5.      //precteme znak a pridame ho do bufferu
  6.      $character = fgetc($file);
  7.      $buffer .= $character;    
  8.  
  9.       /**
  10.        * Pohlidame si konec radku (EOL) v souboru:
  11.        *
  12.        *   \n   - Unix
  13.        *   \r\n - Windows
  14.        *   \r   - Mac
  15.        *
  16.        */
  17.        if (($character == "\x0a") || ($character == "\x0d")) {
  18.                   $character = fgetc($file);
  19.           if ($character != "\x0a") {
  20.           // neni soucasti EOL, vratime se o jeden znak zpet
  21.               fseek($file, -1, SEEK_CUR);
  22.           }
  23.           // EOL ukoncime cteni
  24.           break;
  25.       }
  26.           
  27.       }
  28.  
  29.       //vratime jeden radek
  30.       return $buffer;
  31.    }
  32. ?>
Pro jistotu uvádím ještě příklad použití této funkce.

Zdrojový kód:

  1. <?php
  2. $fp = fopen("export.sql", r);
  3. echo "<pre>";
  4. while (($line = getLine($fp, "sql"))!==false){
  5.   $line = trim($line); //odstraneni prazdnych znaku
  6.   if (!empty($line))echo $line."<br />"; //nevypiseme prazdne radky
  7. }
  8. echo "</pre>";
  9. ?>

17:57 — Komentář Stálý odkaz



Středa únor 25, 2009

PHP funkce převádějící čísla na excelovské názvy sloupců

· rubrika Clanky · kategorie

Nedávno jsem programoval export dat z databáze do formátu xlsx (MS Excel), kde jsem využil projektu "PHPExcel":http://www.codeplex.com/PHPExcel/. Jak asi víte, při základním nastavení jsou v Excelu jednotlivé sloupce označeny písmeny např. AC. Využívá se písmen A-Z, kde A odpovída číslu 1, B číslu 2 atd. Při exportu dat jsem tak potřeboval dle počtu sloupců v tabulce vytvořit příslušný počet "excelovských názvů" sloupců.
Po chvilce zamyšlení mne napadlo převést si tento problém do matematiky, kde by se v základu dalo využít způsobu převodu dekadického čísla do jakékoliv jiné číselné soustavy. Stačí si představit písmena A-Z jako čísla 0-25 a k číslu následně přičíst 65 aby jsme dostali odpovídající číselnou hodnotu znaku v ascii tabulce. Toto ovšem nemůžeme použít, nedostali by jsme to co přesně chceme. Po sloupci s označením Z následuje AA, po AZ následuje BA atd., ale pouhým převodem do jiné soustavy dostaneme něco podobného:
Array ( [0] => 90 ) Z
Array ( [0] => 66 [1] => 66 ) BB
Z tohoto důvodu je třeba funkci pro převod upravit. Výslednou funkci i s testovacím výpisem naleznete zde:

Zdrojový kód:

  1. <?php
  2. /* funkce prevadejici cisla 1...n na nazvy sloupcu v excelu A,B,C,...AA,AB,AC,....AAA,AAB,AAC,.... */
  3.  
  4. function getExcelColumnsNames($column) {
  5.   //cisla mensi 26 muzeme rovnou vratit
  6.   if ($column>=26){
  7.     //delime dekadicke cislo 26 dokud neziskame vsechny zbytky po deleni
  8.     while (ceil($column/26)!= 0){
  9.        if (($column % 26)+64 != 64){ //
  10.           $num[] = ($column % 26)+64;        
  11.           $column = floor($column/26);
  12.        }else{
  13.           unset($num);
  14.           break;
  15.        }
  16.     }
  17.   }else{
  18.     $num[] = $column+65;
  19.   }
  20.   return $num;
  21. }
  22.  
  23. // TEST funkce
  24. // vypis 720 sloupcu
  25. for ($j=0; $j<=720;$j++ ) {
  26.   $array = getExcelColumnsNames($j);
  27.   for ($k=count($array); $k>=0;$k--) {
  28.     echo chr($array[$k]);
  29.   }
  30. }
  31. ?>

16:09 — Komentář [2] — Stálý odkaz



Sobota prosinec 22, 2007

Semestrálka z Javy - dokončeno!

· rubrika Clanky · kategorie

Tento týden jsme dostali zadání semestrální práce z Javy. Jak jsem se s tím vypořádal můžete vidět níže. Ještě to není úplně hotové, nemám totiž dořešené ukončení spuštěného vlákna!

EDIT: Již je to plně funkční

Toto je zdroják hlavního souboru "main.java":

Java - main.java

  1. package ksi.tul.cz.jan.kahoun;
  2.  
  3. public class main {
  4.  
  5.   public static void main(String[] args) {
  6.        
  7.     //vytvorime nove okno a nastavime mu parametry
  8.     window okno1= new window("Semestralni prace", 800, 500);
  9.    
  10.     okno1.setVisible(true);
  11.  
  12.   }
  13.  
  14. }
Zde je zdroják souboru "window.java"

Java - window.java

  1. package ksi.tul.cz.jan.kahoun;
  2.  
  3. import java.awt.BorderLayout;
  4. import java.awt.GridLayout;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import java.io.File;
  8. import java.io.IOException;
  9.  
  10. import javax.swing.JButton;
  11. import javax.swing.JFileChooser;
  12. import javax.swing.JFrame;
  13. import javax.swing.JLabel;
  14. import javax.swing.JPanel;
  15. import javax.swing.JProgressBar;
  16. import javax.swing.JScrollPane;
  17. import javax.swing.JTextArea;
  18. import javax.swing.JTextField;
  19.  
  20. public class window extends JFrame implements ActionListener{
  21.  
  22.   private JButton btnStart, btnStop, btnExit, btnFile1, btnFile2;
  23.   private JLabel label1,label2,label3;
  24.   private JTextField textfield1,textfield2,textfield3;
  25.   private JPanel panel1,panel2, panel3, panel4, panelMain;
  26.   private JTextArea textarea;
  27.   private JProgressBar bar;
  28.   private File dir1, dir2;
  29.   private String extension;
  30.   private boolean editable = false;
  31.   private thread proc;
  32.   private Thread procThread;
  33.  
  34.   public window(String title, int width, int height){
  35.    
  36.     /*
  37.      *
  38.      *  NASTAVENI GRAFICKEHO ROZHRANI
  39.      *
  40.      */
  41.     this.setSize(width,height);
  42.     this.setTitle(title);
  43.     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  44.        
  45.     panel1= new JPanel(new GridLayout(1,3));   
  46.     btnStart = new JButton("Start");
  47.     btnStop = new JButton("Stop");
  48.     btnStop.disable();
  49.     btnStop.addActionListener(this);
  50.     btnExit = new JButton("Exit");
  51.     btnExit.addActionListener(this);
  52.     panel1.add(btnStart);
  53.     panel1.add(btnStop);
  54.     panel1.add(btnExit);
  55.    
  56.     panel2= new JPanel(new BorderLayout());  
  57.     panel3= new JPanel(new BorderLayout());
  58.     panel4= new JPanel(new BorderLayout());
  59.     panelMain= new JPanel (new GridLayout(4,1));
  60.    
  61.     label1= new JLabel("Adresar pro zpracovani: ");
  62.     label2= new JLabel("Pripona souboru:              ");
  63.     label3= new JLabel("Vystupni adresar:             ");
  64.     textfield1=new JTextField();
  65.     textfield1.setEditable(editable);
  66.     textfield2=new JTextField();
  67.     textfield3=new JTextField();
  68.     textfield3.setEditable(editable);
  69.    
  70.     btnFile1=new JButton("...");
  71.     btnFile2=new JButton("...");
  72.    
  73.     panel2.add(label1, BorderLayout.WEST);
  74.     panel2.add(textfield1, BorderLayout.CENTER);
  75.     panel2.add(btnFile1, BorderLayout.EAST);
  76.    
  77.     panel3.add(label2, BorderLayout.WEST);
  78.     panel3.add(textfield2,BorderLayout.CENTER)
  79.    
  80.     panel4.add(label3, BorderLayout.WEST);
  81.     panel4.add(textfield3, BorderLayout.CENTER);
  82.     panel4.add(btnFile2, BorderLayout.EAST);
  83.    
  84.     //vytvorime progressbar a nastavime ho
  85.     bar= new JProgressBar(0,100);
  86.     bar.setValue(0);
  87.     bar.setStringPainted(true);
  88.    
  89.     textarea= new JTextArea();
  90.     //taLog.setSize(600, 400);
  91.     JScrollPane scrollPanel= new JScrollPane(textarea);
  92.     //panelDia.add(scrollPanel);
  93.    
  94.     //vytvorime hlavni panel
  95.     panelMain.add(panel1);
  96.     panelMain.add(panel2);
  97.     panelMain.add(panel3);
  98.     panelMain.add(panel4);
  99.    
  100.     //rozmistime komponenty a panel
  101.     this.setLayout(new BorderLayout());
  102.     this.getContentPane().add(panelMain,BorderLayout.NORTH );
  103.     this.getContentPane().add(scrollPanel, BorderLayout.CENTER);
  104.     this.getContentPane().add(bar, BorderLayout.SOUTH);
  105.    
  106.    
  107.     btnStart.addActionListener(new ActionListener() {
  108.       public void actionPerformed(ActionEvent e) {
  109.         btn1Start(e);
  110.       }
  111.     });
  112.     btnStop.addActionListener(new ActionListener() {
  113.       public void actionPerformed(ActionEvent e) {
  114.         btn2Stop(e);
  115.       }
  116.     });
  117.     btnExit.addActionListener(new ActionListener() {
  118.       public void actionPerformed(ActionEvent e) {
  119.         btn3Exit(e);
  120.       }
  121.     });
  122.     btnFile1.addActionListener(new ActionListener() {
  123.       public void actionPerformed(ActionEvent e) {
  124.         btn4Vstup(e);
  125.       }
  126.     });
  127.     btnFile2.addActionListener(new ActionListener() {
  128.       public void actionPerformed(ActionEvent e) {
  129.         btn5Vystup(e);
  130.       }
  131.     });
  132.    
  133.     /*
  134.      *
  135.      * VYTVORENI VLAKNA
  136.      *
  137.      */
  138.     thread proc = new thread(dir1, dir2, extension, textarea, textfield1, textfield2, textfield3, bar);
  139.     Thread procThread = new Thread(proc);
  140.     procThread.stopped = false;
  141.    
  142.   }
  143.  
  144.   /*
  145.    *
  146.    * TLACITKO PRO ZADANI VSTUPNIHO ADRESARE
  147.    *
  148.    */
  149.   protected void btn4Vstup(ActionEvent e) {
  150.     // TODO Auto-generated method stub
  151.     JFileChooser fc1;
  152.     fc1 = new JFileChooser();
  153.     //nastavime, ze chceme zobrazovat pouze adresare
  154.     fc1.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
  155.     int returnVal = fc1.showOpenDialog(this);
  156.     if (returnVal == JFileChooser.APPROVE_OPTION) {
  157.       dir1 = fc1.getSelectedFile();
  158.       if (!dir1.getPath().equals("")) {
  159.         textfield1.setText(dir1.getPath());
  160.       }  
  161.     }
  162.   }
  163.  
  164.  
  165.   /*
  166.    *
  167.    * TLACITKO PRO ZADANI VYSTUPNIHO ADRESARE
  168.    *
  169.    */
  170.   protected void btn5Vystup(ActionEvent e) {
  171.     // TODO Auto-generated method stub
  172.     JFileChooser fc2;
  173.     fc2 = new JFileChooser();
  174.     //nastavime, ze chceme zobrazovat pouze adresare
  175.     fc2.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
  176.     int returnVal = fc2.showOpenDialog(this);
  177.       if (returnVal == JFileChooser.APPROVE_OPTION) {
  178.         dir2 = fc2.getSelectedFile();
  179.        
  180.         if (!dir2.getPath().equals("")) {
  181.           textfield3.setText(dir2.getPath());          
  182.         }
  183.     }
  184.    
  185.   }
  186.  
  187.   /*
  188.    *
  189.    * TLACITKO PRO SPUSTENI VLAKNA
  190.    *
  191.    */
  192.   protected void btn1Start(ActionEvent e) {
  193.    
  194.     //ziskame priponu a prevedeme ji na male znaky
  195.     extension = textfield2.getText().toLowerCase();
  196.    
  197.     //jsou zadane potrebne veci?
  198.     if (!extension.equals("") && !textfield1.getText().equals("") && !textfield3.getText().equals("")){
  199.            
  200.       btnStop.setEnabled(true);
  201.       btnStart.enable(false)
  202.      
  203.       //spustime vlakno
  204.       procThread.stopped = false;
  205.       procThread.start();
  206.      
  207.       btnStop.enable(false);
  208.       btnStart.enable(true);     
  209.     }
  210.     else {
  211.       textarea.setText(textarea.getText()+"Nezadali jste příponu nebo jste nevybrali adresář(e)!\n");
  212.     }
  213.   }
  214.  
  215.   /*
  216.    *
  217.    * TLACITKO PRO ZASTAVENI VLAKNA
  218.    *
  219.    */
  220.   protected void btn2Stop(ActionEvent e) {
  221.     // TODO Auto-generated method stub
  222.     textarea.setText(textarea.getText()+"Zmacknuto tlacitko stop! \n");
  223.  
  224.     procThread.stopped = true;
  225.  
  226.     if (!btnStart.isEnabled()){
  227.       procThread.stop();
  228.       procThread.destroy();
  229.       
  230.       btnStart.setEnabled(true);
  231.       btnStop.disable();
  232.     }
  233.      
  234.   }
  235.  
  236.   /*
  237.    *
  238.    * TLACITKO PRO UKONCENI APLIKACE
  239.    *
  240.    */
  241.   protected void btn3Exit(ActionEvent e) {
  242.     // TODO Auto-generated method stub
  243.     dispose();
  244.         System.exit(0);
  245.   }
  246.  
  247.   @Override
  248.   public void actionPerformed(ActionEvent e) {
  249.     // TODO Auto-generated method stub   
  250.   }    
  251. }
a poslednim souborem je "thread.java":

Java - thread.java

  1. package ksi.tul.cz.jan.kahoun;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.File;
  5. import java.io.FileReader;
  6. import java.io.FileWriter;
  7. import java.io.IOException;
  8.  
  9. import javax.swing.JProgressBar;
  10. import javax.swing.JTextArea;
  11. import javax.swing.JTextField;
  12.  
  13. public class thread implements Runnable {
  14.  
  15.   /**
  16.    *
  17.    */
  18.   private static final long serialVersionUID = 1L;
  19.   private String extension;
  20.   private File dir1, dir2;
  21.   private int af_count, l_count, f_count;
  22.   private JTextArea textarea;
  23.   private JProgressBar bar;
  24.   private JTextField textfield1,textfield2,textfield3;
  25.   public boolean stopped;
  26.  
  27.   public thread(File dir1, File dir2, String extension, JTextArea textarea, JTextField textfield1, JTextField textfield2, JTextField textfield3, JProgressBar bar) {
  28.    
  29.     this.dir1 = dir1;
  30.     this.dir2 = dir2;
  31.     this.extension = extension;
  32.     this.textarea = textarea;
  33.     this.bar = bar;
  34.     this.textfield1 = textfield1;
  35.     this.textfield2 = textfield2;
  36.     this.textfield3 = textfield3;
  37.    
  38.   }
  39.  
  40.   @Override
  41.   public void run() {
  42.     while (!stopped) {
  43.     //vynulujeme statistiky, textareau a progress bar
  44.     textarea.setText("");
  45.     af_count = f_count = l_count = 0;
  46.     bar.setValue(0);
  47.    
  48.     textarea.setText(textarea.getText()+"pripona: "+extension+" \n");
  49.     textarea.setText(textarea.getText()+"adresar pro zpracovani: "+textfield1.getText()+" \n");
  50.     textarea.setText(textarea.getText()+"vystupni adresar: "+textfield3.getText()+" \n\n");
  51.    
  52.     //zacneme prochazet adresare aby jsme spocitali soubory pro progressbar
  53.     listContents(dir1, extension, true);
  54.    
  55.     textarea.setText(textarea.getText()+"Nalezené soubory: \n");
  56.    
  57.     //zacneme prochazet adresare a hledat soubory se stejnou priponou
  58.     listContents(dir1, extension, false);
  59.  
  60.     //ulozime statistiky
  61.     saveStats();
  62.  
  63.     textarea.setText(textarea.getText()+"\n\nPočet souborů: "+af_count+" \n");
  64.     textarea.setText(textarea.getText()+"počet řádků: "+l_count+" \n");
  65.     }
  66.   }
  67.  
  68.   //funkce na prochazeni adresaru
  69.   private void listContents(File dir, String ext, boolean progress) {
  70.  
  71.     String[] files;  // pro ulozeni obsahu slozky
  72.     files = dir.list();
  73.      
  74.     for (int i = 0; i < files.length; i++) {
  75.       File f;
  76.       f = new File(dir, files[i]);
  77.      
  78.       if ( f.isDirectory() ) {
  79.         //rekurzivni volani funkce listContents
  80.         listContents(f, ext, progress);
  81.       }
  82.       else { 
  83.         //ma soubor zadanou priponu?
  84.         if (ext.equals(getExtension(f))) {
  85.           //pocitame vsechny soubory?
  86.           if (!progress){          
  87.             f_count ++;
  88.             double barvalue = ((double) f_count /(af_count/100));
  89.             bar.setValue((int) barvalue);
  90.             lineCount(f.getPath());
  91.             textarea.setText(textarea.getText()+f.getPath()+"\n");
  92.           }else{         
  93.             af_count ++; //pocitame vsechny soubory pro progressbar
  94.           }
  95.         }                        
  96.       }    
  97.     }//konec cyklu
  98.   }
  99.  
  100.   //funkce na ziskani pripony souboru
  101.     public static String getExtension(File f)
  102.     {
  103.       String ext = null;
  104.       String s = f.getName(); //ziskame nazev souboru
  105.       int i = s.lastIndexOf('.'); //ziskame posledni vyskyt znaku .
  106.  
  107.       if (i > 0 && i < s.length() - 1) {
  108.         ext = s.substring(i+1).toLowerCase(); //vytahneme priponu (na pozici i je . proto +1)
  109.       }
  110.       if(ext == null){
  111.         return ""; //nektere pripony maji na konci tecku, proto vracime prazdny retezec!
  112.       }
  113.       return ext;
  114.     }
  115.    
  116.     //funkce na zjisteni poctu radku
  117.     public void lineCount(String file) {
  118.  
  119.     FileReader fr = null;
  120.     BufferedReader br = null;
  121.         try {
  122.           //otevreni souboru
  123.           fr = new FileReader(file);
  124.             br = new BufferedReader(fr);
  125.           
  126.             //spocitame radky
  127.           while((br.readLine()) != null) {
  128.           l_count++;
  129.           }
  130.         
  131.         } catch (IOException e) {
  132.           e.printStackTrace();
  133.         } finally {
  134.            //jestli vse probehlo ok, zavreme soubor
  135.            if (fr != null) {
  136.              try {
  137.                  fr.close();
  138.              } catch (IOException ioe) {
  139.              }
  140.            }
  141.         }
  142.      }
  143.    
  144.     //ulozeni statistik
  145.     public void saveStats() {
  146.      
  147.       FileWriter fw = null;
  148.         try {
  149.           //otevreni souboru
  150.           fw = new FileWriter(dir2.getPath()+"\\statistika.txt");
  151.     
  152.             fw.write("Počet souborů s příponou \""+extension+"\" je: "+f_count+"\n");
  153.             fw.write("Celkový počet řádek v souborech s příponou: \""+extension+"\" je: "+l_count+"\n");
  154.  
  155.         } catch (IOException e1) {
  156.           e1.printStackTrace();
  157.         } finally {
  158.            //jestli vse probehlo ok, zavreme soubor
  159.            if (fw != null) {
  160.              try {
  161.                  fw.close();
  162.              } catch (IOException ioe) {
  163.              }
  164.            }
  165.         }
  166.      
  167.     }
  168. }

18:49 — Komentář Stálý odkaz



XHTML 1.0 Strict - CSS