Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.188.138] |
|
Сообщ.
#1
,
|
|
|
Мне над написать прогу по поиску в директории zip-бомб.
Вопрос в том, каким способом мне определить что эт бомба а не обычный архив? И ещё, как реализовать отправку инфы по почте? |
Сообщ.
#2
,
|
|
|
Пожалуйста, впредь в одной теме задавайте один вопрос.
Цитата Geptor @ Мне над написать прогу по поиску в директории zip-бомб. Можно просветить местную темноту (меня в том числе), что есть zip-бомба и какое отношение это имеет к java? |
Сообщ.
#4
,
|
|
|
Цитата Geptor @ Вопрос в том, каким способом мне определить что эт бомба а не обычный архив? я бы начал распаковку и смотрел бы во сколько раз уже распакованные данные больше самого архива. Цитата Geptor @ И ещё, как реализовать отправку инфы по почте? http://java.sun.com/products/javamail/ |
Сообщ.
#5
,
|
|
|
Цитата Konigsberg @ я бы начал распаковку и смотрел бы во сколько раз уже распакованные данные больше самого архива. Судя по описанию в википедии и прилагаемому примеру, достаточно вытащить информацию о файлах из архива, не распаковывая. |
Сообщ.
#6
,
|
|
|
Цитата wind @ Судя по описанию в википедии и прилагаемому примеру, достаточно вытащить информацию о файлах из архива, не распаковывая. ну я читал не особо внимательно, хотя следить за размером распакованных данных не помешает, если архив попытается "обмануть" на счет размера данных |
Сообщ.
#7
,
|
|
|
Извиняюсь за свою неопытность по созданию тем.
Вот и подошли к тому вопросу который меня интересовал. Какими методами можно получить инфу об архиве? |
Сообщ.
#8
,
|
|
|
java.util.zip.ZipEntry
public long getSize() - Returns the uncompressed size of the entry data, or -1 if not known. |
Сообщ.
#9
,
|
|
|
Вот нашел пример проги работающей с zip-ами. Ток в коде отмечены 4 ошибки. Мне не понятно в чём дело. Помогите исправить.
Вот код: import javax.swing.*; import javax.swing.filechooser.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.*; import java.io.*; import java.io.FileFilter; import java.util.zip.ZipInputStream; import java.util.zip.ZipEntry; import java.util.ArrayList; /** * Created by IntelliJ IDEA. * User: Witcher * Date: 06.11.2007 * Time: 20:37:42 * To change this template use File | Settings | File Templates. */ public class ZipTest { public static void main(String[] args) { ZipTestFrame frame = new ZipTestFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } class ZipTestFrame extends JFrame { public ZipTestFrame() { setTitle("ZipTest"); setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); JMenuBar menuBar = new JMenuBar(); JMenu menu = new JMenu("File"); JMenuItem openItem = new JMenuItem("Open"); menu.add(openItem); openItem.addActionListener(new OpenAction()); JMenuItem exitItem = new JMenuItem("Exit"); menu.add(exitItem); exitItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { System.exit(0); } }); menuBar.add(menu); setJMenuBar(menuBar); fileText = new JTextArea(); fileCombo = new JComboBox(); fileCombo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { loadZipFile((String) fileCombo.getSelectedItem()); } }); add(fileCombo, BorderLayout.SOUTH); add(new JScrollPane(fileText), BorderLayout.CENTER); } private class OpenAction implements ActionListener { public void actionPerformed(ActionEvent event) { JFileChooser chooser = new JFileChooser(); chooser.setCurrentDirectory(new File(".")); ExtensionFileFilter filter = new ExtensionFileFilter(); filter.addExtension(".zip"); filter.addExtension(".jar"); filter.setDescription("ZIP archives"); chooser.setFileFilter(filter); int r = chooser.showOpenDialog(ZipTestFrame.this); if (r == JFileChooser.APPROVE_OPTION) { zipname = chooser.getSelectedFile().getPath(); scanZipFile(); } } } public void scanZipFile() { fileCombo.removeAllItems(); try { ZipInputStream zin = new ZipInputStream(new FileInputStream(zipname)); ZipEntry entry; while ((entry = zin.getNextEntry()) != null) { fileCombo.addItem(entry.getName()); zin.closeEntry(); } zin.close(); } catch (IOException e) { e.printStackTrace(); } } public void loadZipFile(String name) { try { ZipInputStream zin = new ZipInputStream(new FileInputStream(zipname)); ZipEntry entry; fileText.setText(""); while ((entry = zin.getNextEntry()) != null) { if (entry.getName().equals(name)) { BufferedReader in = new BufferedReader(new InputStreamReader(zin)); String line; while ((line = in.readLine()) != null) { fileText.append(line); fileText.append("\n"); } } zin.closeEntry(); } zin.close(); } catch (IOException e) { e.printStackTrace(); } } public static final int DEFAULT_WIDTH = 400; public static final int DEFAULT_HEIGHT = 300; private JComboBox fileCombo; private JTextArea fileText; private String zipname; } class ExtensionFileFilter extends FileFilter { /** Adds an extension that this file filter recognizes. @param extension a file extension (such as ".txt" or "txt") */ public void addExtension(String extension) { if (!extension.startsWith(".")) extension = "." + extension; extensions.add(extension.toLowerCase()); } /** Sets a description for the file set that this file filter recognizes. @param aDescription a description for the file set */ public void setDescription(String aDescription) { description = aDescription; } /** Returns a description for the file set that this file filter recognizes. @return a description for the file set */ public String getDescription() { return description; } public boolean accept(File f) { if (f.isDirectory()) return true; String name = f.getName().toLowerCase(); for (String e : extensions) if (name.endsWith(e)) return true; return false; } private String description = ""; private ArrayList<String> extensions = new ArrayList<String>(); } |
Сообщ.
#10
,
|
|
|
Выискивать ошибки лень, попробуйте сами. Вот вам пример: Простой ZIP-архиватор
|
Сообщ.
#11
,
|
|
|
Geptor, всё очень просто - ты напутал с импортами. Вместо нужного тебе класса javax.swing.filechooser.FileFilter ты импортировал java.io.FileFilter.
|
Сообщ.
#12
,
|
|
|
Как работать с одним zip архивом я разобрался. А вот как работать с архивами в архиве я не понима. во всех доках пишется только про один архив(без вложенных). я конечно пытался сам разобраться но хорошего из этого мало вышло.
Суть дела такова, есть файл последовательно заархивированный: b1.zip -> b2.zip -> b3.zip -> b4.zip -> t.txt. Мне над добраться до текстового файла. Сам файл читать не надо и разархивировать zip тоже, надо только получать инфу о каждом zip-е (ZipEntry). Код писать в метод scanZipFile. import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.io.*; import java.util.ArrayList; import java.util.Enumeration; import java.util.zip.ZipInputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import javax.swing.filechooser.FileFilter; /** * Created by IntelliJ IDEA. * User: Witcher * Date: 04.11.2007 * Time: 14:50:57 * To change this template use File | Settings | File Templates. */ public class ZipBomb { public static void main(String arg[]) { final SearchZipBomb frame = new SearchZipBomb("SearchZipBomb"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); frame.setResizable(false); } } class SearchZipBomb extends JFrame{ private JPanel panel = new JPanel(new BorderLayout()); private TextArea listZipBomb = new TextArea("",5, 10, JScrollBar.VERTICAL); private TextField directory = new TextField(10), email = new TextField(10); private JButton review = new JButton("Обзор"), start = new JButton("Старт "), sendMail = new JButton("Отправить"); private JList listBomb = new JList(); private FileDialog file; private String rootZip = new String(); private String scanDir = new String(); SearchZipBomb(String titl) { setTitle(titl); setSize(450, 170); GridBagLayout layout = new GridBagLayout(); String[] ds = {"aaa", "bbb"}; listBomb.setListData(ds); setLayout(layout); viewInterface(); setHandlerEvents(); } void viewInterface() { JLabel dir = new JLabel("Дериктория"); JLabel mail = new JLabel("E-mail"); listZipBomb.setBackground(Color.WHITE); listZipBomb.setEditable(false); listZipBomb.setVisible(true); directory.setBackground(Color.WHITE); directory.setEditable(false); add(listZipBomb, new GBC(0, 0, 1, 5).setFill(GBC.BOTH).setWeight(250, 0).setInsets(8)); add(dir, new GBC(1, 0).setAnchor(GBC.WEST).setInsets(8, 0, 0, 0)); add(directory, new GBC(1, 1).setFill(GBC.HORIZONTAL).setWeight(250, 0).setInsets(2)); add(review, new GBC(2, 1).setFill(GBC.HORIZONTAL).setInsets(0, 2, 0, 8)); add(start, new GBC(2, 2).setFill(GBC.HORIZONTAL).setInsets(5, 2, 0, 8)); add(mail, new GBC(1, 3).setAnchor(GBC.WEST)); add(email, new GBC(1, 4).setFill(GBC.HORIZONTAL).setWeight(250, 0).setInsets(0, 2, 8, 2)); add(sendMail, new GBC(2, 4).setFill(GBC.HORIZONTAL).setInsets(0, 2, 8, 8)); } void setHandlerEvents() { review.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser(); chooser.setCurrentDirectory(new File(".")); chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int r = chooser.showOpenDialog(SearchZipBomb.this); if (r == JFileChooser.APPROVE_OPTION) { listZipBomb.setText(""); scanDir = chooser.getSelectedFile().getPath(); directory.setText(scanDir); } } }); start.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(scanDir.length() == 0) return; scanDirectory(scanDir); } }); } public void scanDirectory(String path) { File sd = new File(path); if(!sd.isDirectory()) return; File[] d = sd.listFiles(new ExtensionFilenameFilter()); for(int i = 0; i < d.length; i++) { if(d[i].isFile()) { rootZip = d[i].getName(); scanZipFile(d[i].getPath()); } if(d[i].isDirectory()) { scanDirectory(d[i].getPath()); } } } public void scanZipFile(String zipName) { try { ZipFile fZip = new ZipFile(zipName); Enumeration en3 = fZip.entries(); ZipEntry e1 = (ZipEntry) en3.nextElement(); } catch (IOException e) { e.printStackTrace(); } } } class ExtensionFilenameFilter implements FilenameFilter{ public boolean accept(File dir, String name) { File f = new File(dir, name); if(f.isDirectory()) return true; if(f.getName().toLowerCase().endsWith(".zip")) return true; return false; } } |
Сообщ.
#13
,
|
|
|
Цитата Geptor @ А вот как работать с архивами в архиве я не понима. Очень просто - разархивировать его, и открыть как архив. |
Сообщ.
#14
,
|
|
|
Вот типа метод сканирующий архивы в архиве. Только он написан для архива вид которого я привел выше. Дело в том что код как вы видите карявый. Помогите поправить чтоб код был получше, ведь метод должен выть рекурсивный(эт пока ток набросок).
public void scanZipFile(String zipName) { try { ZipFile fZip = new ZipFile(zipName); Enumeration en1 = fZip.entries(); ZipEntry e1 = (ZipEntry) en1.nextElement(); ZipInputStream i1 = new ZipInputStream(fZip.getInputStream(e1)); ZipEntry e2 = i1.getNextEntry(); ZipFile f2 = new ZipFile(e2.getName()); Enumeration en2 = f2.entries(); ZipEntry e3 = (ZipEntry) en2.nextElement(); ZipInputStream i2 = new ZipInputStream(f2.getInputStream(e3)); ZipEntry e4 = i2.getNextEntry(); i1.closeEntry(); i1.close(); i2.closeEntry(); i2.close(); } catch (IOException e) { e.printStackTrace(); } } |
Сообщ.
#15
,
|
|
|
Всем спасибо.
|