การสร้าง การทําสําเนา การลบ การย้าย และการเปลี่ยนชื่อไฟล์
สรุป
ดําเนินการต่างๆ เช่น "สร้าง"ทําซ้ํา" "ลบ" และ "ย้าย" บนไฟล์
สภาพแวดล้อมในการทํางาน
ข้อกําหนดเบื้องต้น
รุ่น XNA ที่รองรับ |
|
แพลตฟอร์มที่รองรับ |
|
Windows ต้องใช้เวอร์ชัน Vertex Shader | 1.1 |
เวอร์ชัน Pixel Shader ที่จําเป็นของ Windows | 1.1 |
สภาพแวดล้อมในการทํางาน
แท่น |
วิธีการทํางานกับตัวอย่าง
แป้นพิมพ์ใช้งานได้คอนโทรลเลอร์ Xbox | 360 เมาส์ | ||
---|---|---|---|
สร้างไฟล์ "SampleA" | A | A | - |
ทําซ้ําไฟล์ "SampleA" เป็นไฟล์ "SampleB" | B | B | - |
ลบไฟล์ "SampleB" | X | X | - |
ย้าย (เปลี่ยนชื่อ) แฟ้ม "SampleA" ไปยังแฟ้ม "SampleB" | Y | Y | - |
สาร
สร้างไฟล์
หากคุณต้องการสร้างไฟล์ ให้ใช้เมธอด "File.Create" ระบุเส้นทางของไฟล์ที่จะสร้างในอาร์กิวเมนต์แรก
try
{
if (File.Exists(sampleAFilePath) == false)
{
// 「SampleA.txt」の作成
using (FileStream stream = File.Create(sampleAFilePath))
{
// 操作日時
this.createFileDateTime = DateTime.Now;
// ストリームを閉じる
stream.Close();
}
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex);
}
เมื่อคุณสร้างแฟ้ม อินสแตนซ์ของสตรีมแฟ้มที่เปิดอยู่ (FileStream) จะถูกส่งกลับ ดังนั้น คุณควรอ่านและเขียนแฟ้มถ้าจําเป็น แล้วปิดสตรีมในตอนท้าย
นอกจากนี้ ถ้ามีแฟ้มอยู่แล้วในเส้นทางแฟ้มที่คุณกําลังพยายามสร้าง เมธอด File.Create จะส่งข้อยกเว้น ถ้าคุณต้องการระบุจํานวนไบต์ในแฟ้มที่จะสร้าง สิทธิ์การเข้าถึง และอื่นๆ ให้ใช้วิธีการโอเวอร์โหลดของเมธอด File.Create
File.Create
วิธี
สร้างไฟล์ในเส้นทางที่ระบุ
ทาง | เชือก | เส้นทางและชื่อของไฟล์ที่จะสร้าง |
ส่งคืนค่า | File สตรีม | FileStream ที่ให้การเข้าถึงการอ่าน/เขียนไปยังไฟล์ที่ระบุโดยเส้นทาง |
การทําซ้ําไฟล์
เมื่อต้องการทําซ้ําแฟ้ม ให้ใช้วิธีการ File.Copy อาร์กิวเมนต์แรกระบุเส้นทางไฟล์ต้นทาง และอาร์กิวเมนต์ที่สองระบุเส้นทางไฟล์ปลายทาง
try
{
if (File.Exists(sampleAFilePath) == true &&
File.Exists(sampleBFilePath) == false)
{
// 「SampleA.txt」を「SampleB.txt」に複製
File.Copy(sampleAFilePath, sampleBFilePath);
// 操作日時
this.copyFileDateTime = DateTime.Now;
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex);
}
ถ้าแฟ้มไม่มีอยู่บนแหล่งที่มา หรือถ้าคุณไม่มีสิทธิ์เข้าถึงแฟ้ม หรือถ้ามีแฟ้มบนปลายทาง หากคุณต้องการเขียนทับไฟล์ ให้ใช้การโอเวอร์โหลดของเมธอดเดียวกัน "File.Copy(String, String, Boolean)"
File.Copy
วิธี
คัดลอกไฟล์ที่มีอยู่ไปยังไฟล์ใหม่ คุณไม่สามารถเขียนทับแฟ้มที่มีชื่อเดียวกันได้
sourceFileName | เชือก | เส้นทางไฟล์ที่จะทําซ้ํา |
destFileName | เชือก | ชื่อของไฟล์ปลายทาง คุณไม่สามารถใช้ไดเรกทอรีหรือไฟล์ที่มีอยู่ได้ |
การลบไฟล์
เมื่อต้องการลบแฟ้ม ให้ใช้เมธอด "File.Delete" ระบุเส้นทางของไฟล์ที่จะลบในอาร์กิวเมนต์แรก
try
{
// 「SampleB.txt」を削除
File.Delete(sampleBFilePath);
// 操作日時
this.deleteFileDateTime = DateTime.Now;
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex);
}
หากไม่มีไฟล์ที่จะลบในตอนแรกวิธีนี้จะไม่ทําให้เกิดข้อยกเว้น
File.Delete
วิธี
คัดลอกไฟล์ที่มีอยู่ไปยังไฟล์ใหม่ คุณไม่สามารถเขียนทับแฟ้มที่มีชื่อเดียวกันได้
ทาง | เชือก | ชื่อของแฟ้มที่จะลบ |
การย้าย (การเปลี่ยนชื่อ) ไฟล์
หากคุณต้องการย้ายไฟล์ไปยังโฟลเดอร์อื่นหรือเปลี่ยนชื่อไฟล์ ให้ใช้เมธอด "File.Move"
try
{
if (File.Exists(sampleAFilePath) == true &&
File.Exists(sampleBFilePath) == false)
{
// 「SampleA.txt」を「SampleB.txt」に移動(リネーム)
File.Move(sampleAFilePath, sampleBFilePath);
// 操作日時
this.moveFileDateTime = DateTime.Now;
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex);
}
แสดงข้อยกเว้นหากไม่มีแฟ้มบนต้นทาง หรือถ้ามีแฟ้มที่ปลายทาง
File.Move
วิธี
ย้ายไฟล์ที่ระบุไปยังตําแหน่งที่ตั้งใหม่
sourceFileName | เชือก | ชื่อของไฟล์ที่จะย้าย |
destFileName | เชือก | เส้นทางใหม่ของแฟ้ม |
รหัสทั้งหมด
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;
namespace FileOperation
{
<summary>
ゲームメインクラス
</summary>
public class GameMain : Microsoft.Xna.Framework.Game
{
<summary>
ファイル操作の種類
</summary>
enum FileOperationType
{
None,
Create,
Copy,
Delete,
Move
}
<summary>
グラフィックデバイス管理クラス
</summary>
private GraphicsDeviceManager graphics = null;
<summary>
スプライトのバッチ化クラス
</summary>
private SpriteBatch spriteBatch = null;
<summary>
スプライトでテキストを描画するためのフォント
</summary>
private SpriteFont font = null;
<summary>
ファイルを作成した日時
</summary>
private DateTime createFileDateTime = new DateTime();
<summary>
ファイルを複製した日時
</summary>
private DateTime copyFileDateTime = new DateTime();
<summary>
ファイルを削除した日時
</summary>
private DateTime deleteFileDateTime = new DateTime();
<summary>
ファイルを移動した日時
</summary>
private DateTime moveFileDateTime = new DateTime();
<summary>
「SampleA.txt」ファイルが存在するか
</summary>
private bool? isExistSampleAFile = null;
<summary>
「SampleB.txt」ファイルが存在するか
</summary>
private bool? isExistSampleBFile = null;
<summary>
行おうとするファイル操作の種類
</summary>
private FileOperationType operationType = FileOperationType.None;
<summary>
直線のキーボード入力の状態
</summary>
private KeyboardState oldKeyboardState = new KeyboardState();
<summary>
直線のゲームパッド入力の状態
</summary>
private GamePadState oldGamePadState = new GamePadState();
<summary>
GameMain コンストラクタ
</summary>
public GameMain()
{
// グラフィックデバイス管理クラスの作成
this.graphics = new GraphicsDeviceManager(this);
// ゲームコンテンツのルートディレクトリを設定
this.Content.RootDirectory = "Content";
// ゲームサービスコンポーネントを追加
this.Components.Add(new GamerServicesComponent(this));
}
<summary>
ゲームが始まる前の初期化処理を行うメソッド
グラフィック以外のデータの読み込み、コンポーネントの初期化を行う
</summary>
protected override void Initialize()
{
// TODO: ここに初期化ロジックを書いてください
// コンポーネントの初期化などを行います
base.Initialize();
}
<summary>
ゲームが始まるときに一回だけ呼ばれ
すべてのゲームコンテンツを読み込みます
</summary>
protected override void LoadContent()
{
// テクスチャーを描画するためのスプライトバッチクラスを作成します
this.spriteBatch = new SpriteBatch(this.GraphicsDevice);
// フォントをコンテンツパイプラインから読み込む
this.font = this.Content.Load<SpriteFont>("Font");
}
<summary>
ゲームが終了するときに一回だけ呼ばれ
すべてのゲームコンテンツをアンロードします
</summary>
protected override void UnloadContent()
{
// TODO: ContentManager で管理されていないコンテンツを
// ここでアンロードしてください
}
<summary>
描画以外のデータ更新等の処理を行うメソッド
主に入力処理、衝突判定などの物理計算、オーディオの再生など
</summary>
<param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
protected override void Update(GameTime gameTime)
{
// キーボードの情報取得
KeyboardState keyboardState = Keyboard.GetState();
// ゲームパッドの情報取得
GamePadState gamePadState = GamePad.GetState(PlayerIndex.One);
// Xbox360 コントローラの BACK ボタンを押したときにゲームを終了させます
if (gamePadState.Buttons.Back == ButtonState.Pressed)
{
this.Exit();
}
if ((keyboardState.IsKeyDown(Keys.A) && this.oldKeyboardState.IsKeyUp(Keys.A)) ||
(gamePadState.Buttons.A == ButtonState.Pressed &&
this.oldGamePadState.Buttons.A == ButtonState.Released))
{
// A ボタンが押されたとき /////
// ファイル作成操作
this.operationType = FileOperationType.Create;
// ストレージデバイス選択UIを表示するための設定を行います
Guide.BeginShowStorageDeviceSelector(this.GetStorageDevice, null);
}
else if ((keyboardState.IsKeyDown(Keys.B) && this.oldKeyboardState.IsKeyUp(Keys.B)) ||
(gamePadState.Buttons.B == ButtonState.Pressed &&
this.oldGamePadState.Buttons.B == ButtonState.Released))
{
// B ボタンが押されたとき /////
// ファイル複製操作
this.operationType = FileOperationType.Copy;
// ストレージデバイス選択UIを表示するための設定を行います
Guide.BeginShowStorageDeviceSelector(this.GetStorageDevice, null);
}
else if ((keyboardState.IsKeyDown(Keys.X) && this.oldKeyboardState.IsKeyUp(Keys.X)) ||
(gamePadState.Buttons.X == ButtonState.Pressed &&
this.oldGamePadState.Buttons.X == ButtonState.Released))
{
// X ボタンが押されたとき /////
// ファイル削除操作
this.operationType = FileOperationType.Delete;
// ストレージデバイス選択UIを表示するための設定を行います
Guide.BeginShowStorageDeviceSelector(this.GetStorageDevice, null);
}
else if ((keyboardState.IsKeyDown(Keys.Y) && this.oldKeyboardState.IsKeyUp(Keys.Y)) ||
(gamePadState.Buttons.Y == ButtonState.Pressed &&
this.oldGamePadState.Buttons.Y == ButtonState.Released))
{
// Y ボタンが押されたとき /////
// ファイル移動操作
this.operationType = FileOperationType.Move;
// ストレージデバイス選択UIを表示するための設定を行います
Guide.BeginShowStorageDeviceSelector(this.GetStorageDevice, null);
}
// 入力情報を記憶
this.oldKeyboardState = keyboardState;
this.oldGamePadState = gamePadState;
// 登録された GameComponent を更新する
base.Update(gameTime);
}
<summary>
ストレージデバイスを取得するために呼ばれる
</summary>
<param name="result">非同期処理の結果</param>
private void GetStorageDevice(IAsyncResult result)
{
// 結果をもとにストレージデバイスの選択UIを終了してストレージデバイスを取得します
StorageDevice storageDevice = Guide.EndShowStorageDeviceSelector(result);
if (storageDevice != null && storageDevice.IsConnected)
{
// ストレージデバイスの取得に成功し、接続されている場合 /////
// ストレージコンテナを開きます
using (StorageContainer container = storageDevice.OpenContainer("XNASample"))
{
// ファイルパス
string sampleAFilePath = Path.Combine(container.Path, "SampleA.txt");
string sampleBFilePath = Path.Combine(container.Path, "SampleB.txt");
switch (this.operationType)
{
case FileOperationType.Create:
try
{
if (File.Exists(sampleAFilePath) == false)
{
// 「SampleA.txt」の作成
using (FileStream stream = File.Create(sampleAFilePath))
{
// 操作日時
this.createFileDateTime = DateTime.Now;
// ストリームを閉じる
stream.Close();
}
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex);
}
break;
case FileOperationType.Copy:
try
{
if (File.Exists(sampleAFilePath) == true &&
File.Exists(sampleBFilePath) == false)
{
// 「SampleA.txt」を「SampleB.txt」に複製
File.Copy(sampleAFilePath, sampleBFilePath);
// 操作日時
this.copyFileDateTime = DateTime.Now;
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex);
}
break;
case FileOperationType.Delete:
try
{
// 「SampleB.txt」を削除
File.Delete(sampleBFilePath);
// 操作日時
this.deleteFileDateTime = DateTime.Now;
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex);
}
break;
case FileOperationType.Move:
try
{
if (File.Exists(sampleAFilePath) == true &&
File.Exists(sampleBFilePath) == false)
{
// 「SampleA.txt」を「SampleB.txt」に移動(リネーム)
File.Move(sampleAFilePath, sampleBFilePath);
// 操作日時
this.moveFileDateTime = DateTime.Now;
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex);
}
break;
}
// 各ファイルの存在確認
this.isExistSampleAFile = File.Exists(sampleAFilePath);
this.isExistSampleBFile = File.Exists(sampleBFilePath);
}
}
}
<summary>
描画処理を行うメソッド
</summary>
<param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
protected override void Draw(GameTime gameTime)
{
// 画面を指定した色でクリアします
this.GraphicsDevice.Clear(Color.CornflowerBlue);
// スプライトの描画準備
this.spriteBatch.Begin();
// テキスト描画
this.spriteBatch.DrawString(this.font,
"A : Create 'SampleA.txt'\r\n" +
"B : Copy 'SampleA.txt' to 'SampleB.txt'\r\n" +
"X : Delete 'SampleB.txt'\r\n" +
"Y : Move 'SampleA.txt' to 'SampleB.txt'",
new Vector2(50.0f, 50.0f), Color.White);
// ファイル作成時間
string createFileText = "CreateFile : ";
if (this.createFileDateTime.Ticks != 0)
{
createFileText += this.createFileDateTime;
}
else
{
createFileText += "?";
}
this.spriteBatch.DrawString(this.font, createFileText,
new Vector2(50.0f, 130.0f), Color.White);
// ファイル複製時間
string copyFileText = "CopyFile : ";
if (this.copyFileDateTime.Ticks != 0)
{
copyFileText += this.copyFileDateTime;
}
else
{
copyFileText += "?";
}
this.spriteBatch.DrawString(this.font, copyFileText,
new Vector2(50.0f, 150.0f), Color.White);
// ファイル削除時間
string deleteFileText = "DeleteFile : ";
if (this.deleteFileDateTime.Ticks != 0)
{
deleteFileText += this.deleteFileDateTime;
}
else
{
deleteFileText += "?";
}
this.spriteBatch.DrawString(this.font, deleteFileText,
new Vector2(50.0f, 170.0f), Color.White);
// ファイル移動時間
string moveFileText = "MoveFile : ";
if (this.moveFileDateTime.Ticks != 0)
{
moveFileText += this.moveFileDateTime;
}
else
{
moveFileText += "?";
}
this.spriteBatch.DrawString(this.font, moveFileText,
new Vector2(50.0f, 190.0f), Color.White);
// 「SampleA.txt」の存在確認
string sampleAFileText = "SampleA.txt Exist : ";
if (this.isExistSampleAFile != null)
{
sampleAFileText += this.isExistSampleAFile;
}
else
{
sampleAFileText += "?";
}
this.spriteBatch.DrawString(this.font, sampleAFileText,
new Vector2(50.0f, 220.0f), Color.White);
// 「SampleB.txt」の存在確認
string sampleBFileText = "SampleB.txt Exist : ";
if (this.isExistSampleBFile != null)
{
sampleBFileText += this.isExistSampleBFile;
}
else
{
sampleBFileText += "?";
}
this.spriteBatch.DrawString(this.font, sampleBFileText,
new Vector2(50.0f, 240.0f), Color.White);
// スプライトの一括描画
this.spriteBatch.End();
// 登録された DrawableGameComponent を描画する
base.Draw(gameTime);
}
}
}