diff --git a/lib/zip/entry.rb b/lib/zip/entry.rb index 8b17f3fc..df973c0d 100644 --- a/lib/zip/entry.rb +++ b/lib/zip/entry.rb @@ -572,6 +572,7 @@ def create_file(dest_path, _continue_on_exists_proc = proc { Zip.continue_on_exi raise ::Zip::DestinationFileExistsError, "Destination '#{dest_path}' already exists" end + ::FileUtils.mkdir_p(::File.dirname(dest_path)) ::File.open(dest_path, 'wb') do |os| get_input_stream do |is| set_extra_attributes_on_path(dest_path) diff --git a/test/file_extract_test.rb b/test/file_extract_test.rb index 57833fcb..0a18e162 100644 --- a/test/file_extract_test.rb +++ b/test/file_extract_test.rb @@ -11,22 +11,11 @@ def setup end def test_extract - ::Zip::File.open(TEST_ZIP.zip_name) do |zf| - zf.extract(ENTRY_TO_EXTRACT, EXTRACTED_FILENAME) - - assert(File.exist?(EXTRACTED_FILENAME)) - AssertEntry.assert_contents(EXTRACTED_FILENAME, - zf.get_input_stream(ENTRY_TO_EXTRACT) { |is| is.read }) - - ::File.unlink(EXTRACTED_FILENAME) - - entry = zf.get_entry(ENTRY_TO_EXTRACT) - entry.extract(EXTRACTED_FILENAME) + assert_extract(EXTRACTED_FILENAME) + end - assert(File.exist?(EXTRACTED_FILENAME)) - AssertEntry.assert_contents(EXTRACTED_FILENAME, - entry.get_input_stream { |is| is.read }) - end + def test_extract_nested_file + assert_extract('test/data/generated/a/b/c/extEntry') end def test_extract_exists @@ -80,4 +69,25 @@ def test_extract_non_entry_2 end assert(!File.exist?(outFile)) end + + private + + def assert_extract(extracted_filename) + ::Zip::File.open(TEST_ZIP.zip_name) do |zf| + zf.extract(ENTRY_TO_EXTRACT, extracted_filename) + + assert(File.exist?(extracted_filename)) + AssertEntry.assert_contents(extracted_filename, + zf.get_input_stream(ENTRY_TO_EXTRACT) { |is| is.read }) + + ::File.unlink(extracted_filename) + + entry = zf.get_entry(ENTRY_TO_EXTRACT) + entry.extract(extracted_filename) + + assert(File.exist?(extracted_filename)) + AssertEntry.assert_contents(extracted_filename, + entry.get_input_stream { |is| is.read }) + end + end end