Створення, дублювання, видалення, переміщення та перейменування файлів
зведення
Виконуйте різні операції, такі як «Створити», «Дублювати», «Видалити» та «Перемістити» над файлом.
Робоче середовище
Передумови
Підтримувані версії XNA |
|
Підтримувані платформи |
|
Потрібна версія Vertex Shader для Windows | 1.1 |
Потрібна версія піксельного шейдера 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
метод
Створює файл за вказаним шляхом.
шлях | Рядок | Шлях та ім'я файлу, який потрібно створити. |
Значення, що повертаються | Файловий потік | 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 генерує виняток. Якщо ви хочете перезаписати файл, використовуйте перевантаження тим самим методом, "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);
}
}
}