コメント
コメントの投稿
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。
using System.IO.Compression;
namespace AppName.Services
{
//DependencyServiceから利用する
public interface ICompressionService
{
void UnZip(string filePath, string folderPath);
void ExtractToFile(ZipArchiveEntry entry, string filePath);
}
}
using System.IO;
using System.IO.Compression;
using Xamarin.Forms;
using AppName.Droid.Services;
using AppName.Services;
[assembly: Dependency(typeof(CompressionService))]
namespace AppName.Droid.Services
{
public class CompressionService : ICompressionService
{
/// <summary>
/// Zipファイルを解凍する
/// </summary>
/// <param name="filePath">Zipファイルパス</param>
/// <param name="folderPath">解凍フォルダ</param>
public void UnZip(string filePath, string folderPath)
{
// ファイルを書き出すフォルダーを作成する
string fileName = System.IO.Path.GetFileNameWithoutExtension(filePath);
if (!folderPath.Contains(fileName))
{
folderPath += "/" + fileName;
}
var directoryInfo = System.IO.Directory.CreateDirectory(folderPath);
// ZIPファイルを開いてZipArchiveオブジェクトを作る
using (ZipArchive archive = ZipFile.Open(filePath, ZipArchiveMode.Read, Encoding.GetEncoding("shift_jis")))
{
// 展開するファイルを選択する
var allTextFiles
= archive.Entries
//.Where(e => e.FullName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
.OrderBy(e => e.FullName);
// 選択したファイルを指定したフォルダーに書き出す
foreach (ZipArchiveEntry entry in allTextFiles)
{
// ZipArchiveEntryオブジェクトのExtractToFileメソッドにフルパスを渡す
//entry.ExtractToFile(Path.Combine(folderPath, entry.FullName), true);
//entry.ExtractToFileがXamarinでは動作しないため下記のソースを追加
//展開する時のパスを決定する
string unzipFilePath = Path.Combine(
folderPath, entry.FullName.Replace('/', '\\'));
if (entry.FullName.EndsWith("/"))
{
//ディレクトリの時
//ディレクトリを作成する
System.IO.Directory.CreateDirectory(unzipFilePath);
}
else
{
//ファイルの時
//ディレクトリを作成する
System.IO.Directory.CreateDirectory(Path.GetDirectoryName(unzipFilePath));
//ファイルを開く
this.ExtractToFile(entry, unzipFilePath);
}
}
}
}
/// <summary>
/// ファイルをコピーする
/// </summary>
/// <param name="entry">Zip内のファイルオブジェクト</param>
/// <param name="filePath">コピー先ファイルパス</param>
public void ExtractToFile(ZipArchiveEntry entry, string filePath)
{
using (FileStream fs2 = File.Open(filePath, FileMode.CreateNew, FileAccess.Write))
{
//エントリの内容をファイルにコピーする
using (Stream strm = entry.Open())
{
strm.CopyTo(fs2);
}
}
}
}
}
using System.Linq;
using System.Text;
using System.IO;
using System.IO.Compression;
using Xamarin.Forms;
using AppName.iOS.Services;
using AppName.Services;
[assembly: Dependency(typeof(CompressionService))]
namespace AppName.iOS.Services
{
public class CompressionService : ICompressionService
{
/// <summary>
/// Zipファイルを解凍する
/// </summary>
/// <param name="filePath">Zipファイルパス</param>
/// <param name="folderPath">解凍フォルダ</param>
public void UnZip(string filePath, string folderPath)
{
// ファイルを書き出すフォルダーを作成する
string fileName = System.IO.Path.GetFileNameWithoutExtension(filePath);
if (!folderPath.Contains(fileName))
{
folderPath += "/" + fileName;
}
var directoryInfo = System.IO.Directory.CreateDirectory(folderPath);
// ZIPファイルを開いてZipArchiveオブジェクトを作る
using (ZipArchive archive = ZipFile.Open(filePath, ZipArchiveMode.Read, Encoding.GetEncoding("shift_jis")))
{
// 展開するファイルを選択する
var allTextFiles
= archive.Entries
//.Where(e => e.FullName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
.OrderBy(e => e.FullName);
// 選択したファイルを指定したフォルダーに書き出す
foreach (ZipArchiveEntry entry in allTextFiles)
{
// ZipArchiveEntryオブジェクトのExtractToFileメソッドにフルパスを渡す
//entry.ExtractToFile(Path.Combine(folderPath, entry.FullName), true);
//entry.ExtractToFileがXamarinでは動作しないため下記のソースを追加
//展開する時のパスを決定する
string unzipFilePath = Path.Combine(
folderPath, entry.FullName.Replace('/', '\\'));
if (entry.FullName.EndsWith("/"))
{
//ディレクトリの時
//ディレクトリを作成する
System.IO.Directory.CreateDirectory(unzipFilePath);
}
else
{
//ファイルの時
//ディレクトリを作成する
System.IO.Directory.CreateDirectory(Path.GetDirectoryName(unzipFilePath));
//ファイルを開く
this.ExtractToFile(entry, unzipFilePath);
}
}
}
}
/// <summary>
/// ファイルをコピーする
/// </summary>
/// <param name="entry">Zip内のファイルオブジェクト</param>
/// <param name="filePath">コピー先ファイルパス</param>
public void ExtractToFile(ZipArchiveEntry entry, string filePath)
{
using (FileStream fs2 = File.Open(filePath, FileMode.CreateNew, FileAccess.Write))
{
//エントリの内容をファイルにコピーする
using (Stream strm = entry.Open())
{
strm.CopyTo(fs2);
}
}
}
}
}
using AppName.Services;
void OnUnCompressButtonClick()
{
string filePath = "zipファイルのフルパス";
string folderPath = "解凍先のフォルダパス";
DependencyService.Get<ICompressionService>().UnZip(filePath, folderPath);
}
using AppName.Services;
using Xamarin.Forms;
public class TestPage : ContentPage
{
void OnUnCompressButtonClick()
{
string filePath = "zipファイルのフルパス";
string folderPath = "解凍先のフォルダパス";
string password = "解凍パスワード";
ICSharpCode.SharpZipLib.Zip.FastZip zip = new ICSharpCode.SharpZipLib.Zip.FastZip();
if (!String.IsNullOrEmpty(password))
{
zip.Password = password;
}
zip.ExtractZip(filePath, folderPath, "");
}
}
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。