binary read

普通にバッファサイズをおもいっきりとって一回読むのでもいいのかなー

public static byte[] GetData( this Stream input, int size ) {
	byte[] buffer = new byte[Math.Min( 1024, size )];
	int totalSize = 0;

	using ( MemoryStream ms = new MemoryStream() ) {
		int readSize;

		while ( totalSize < size && ( ( readSize = input.Read( buffer, 0, GetBuffSize( buffer, size, totalSize ) ) ) > 0 ) ) {
			ms.Write( buffer, 0, readSize );
			totalSize += readSize;
		}

		if ( totalSize != size ) {
			throw new IOException( "Cannot read the size specified." );
		}

		return ms.ToArray();
	}
}

private static int GetBuffSize( byte[] buffer, int size, int totalSize ) {
	return Math.Min( buffer.Length, size - totalSize );
}

終了処理をsizeでなくてreadsizeが0のみで判断すればBinaryのReadToEndになる

		public static byte[] ReadToEnd( this Stream input ) {
			byte[] buffer = new byte[ 1024 ];

			using ( MemoryStream ms = new MemoryStream() ) {
				int readSize;

				while ( ( readSize = input.Read( buffer, 0, buffer.Length ) ) > 0 ) {
					ms.Write( buffer, 0, readSize );
				}

				return ms.ToArray();
			}
		}

エンディアン変更

IPAddress.HostToNetworkOrderとかIPAddress.NetworkToHostOrderがあるのは知ってるけど
ネットワークで使うときでないときはなんか違う気がするんだ。
にしてもなんでsignedだけなんだ

		public static ushort ToBigEndianUInt16( this byte[] source ) {
			return BitConverter.ToUInt16( GetCorrectEndian( source ), 0 );
		}

		public static uint ToBigEndianUInt32( this byte[] source ) {
			return BitConverter.ToUInt32( GetCorrectEndian( source ), 0 );
		}

		public static ulong ToBigEndianUInt64( this byte[] source ) {
			return BitConverter.ToUInt64( GetCorrectEndian( source ), 0 );
		}

		private static byte[] GetCorrectEndian( byte[] source ) {
			byte[] buffer;
			if ( BitConverter.IsLittleEndian ) {
				buffer = source.Reverse().ToArray();
			} else {
				buffer = source;
			}
			return buffer;
		}

Directory全部copy

File.Copyはあるのに!
Static Classも拡張メソッドできたらDirectoryに突っ込みたい

単純なCopyではなくて、複製?overwriteがtrueなら新しいファイルで上書き。こっちが古かったら上書きされる。

CopyDirectoriesだけなら一方向

そういえばWindows的にはFolderなんじゃないかと今更

		/// <summary>
		/// ディレクトリの双方向レプリケーションを実施する。
		/// </summary>
		/// <param name="directory1">複製対象のディレクトリ</param>
		/// <param name="directory2">複製対象のディレクトリ</param>
		/// <param name="overwrite">trueの場合、同一ファイルは更新日時を元に新しいファイルを正として上書きを行う。</param>
		public static void ReplicationDirectory( string directory1, string directory2, bool overwrite = true ) {
			CopyDirectories( directory1, directory2, true );
			CopyDirectories( directory2, directory1, true );
		}

		/// <summary>
		/// ディレクトリの複製を実施する。
		/// </summary>
		/// <param name="sourceDirectory">複製元のディレクトリ</param>
		/// <param name="destDirectory">複製先のディレクトリ</param>
		/// <param name="overwrite">trueの場合、同一ファイルは更新日時を元に新しいファイルを正として上書きを行う。</param>
		public static void CopyDirectories( string sourceDirectory, string destDirectory, bool overwrite ) {
			var sourceDirectoryInfo = new DirectoryInfo( sourceDirectory );
			if ( !sourceDirectoryInfo.Exists ) {
				return;
			}

			var destDirectoryInfo = new DirectoryInfo( destDirectory );

			if ( !destDirectoryInfo.Exists ) {
				destDirectoryInfo.Create();
				destDirectoryInfo.Attributes = sourceDirectoryInfo.Attributes;
			}

			CopyDirectoryFiles( sourceDirectoryInfo, destDirectoryInfo, overwrite );

			foreach ( var sourceSubDirectoryInfo in sourceDirectoryInfo.GetDirectories() ) {
				CopyDirectories( sourceSubDirectoryInfo.FullName
					, Path.Combine( destDirectoryInfo.FullName, sourceSubDirectoryInfo.Name), overwrite );
			}
		}

		private static void CopyDirectoryFiles( DirectoryInfo sourceDirectoryInfo, DirectoryInfo destDirectoryInfo, bool overwrite ) {
			foreach ( var sourceFileInfo in sourceDirectoryInfo.EnumerateFiles() ) {
				var destFileInfoEnum = destDirectoryInfo.EnumerateFiles( sourceFileInfo.Name );

				if ( destFileInfoEnum.Count() != 0 && overwrite ) {
					var destFileInfo = destFileInfoEnum.First();
					if ( destFileInfo.LastWriteTimeUtc < sourceFileInfo.LastWriteTimeUtc ) {
						File.Copy( sourceFileInfo.FullName, destFileInfo.FullName, true );
					} else if ( sourceFileInfo.LastWriteTimeUtc < destFileInfo.LastWriteTimeUtc ) {
						File.Copy( destFileInfo.FullName, sourceFileInfo.FullName, true );
					}
				} else if ( destFileInfoEnum.Count() == 0 ) {
					File.Copy( sourceFileInfo.FullName, Path.Combine( destDirectoryInfo.FullName, sourceFileInfo.Name ) );
				}
			}
		}

SQL SERVER 全テーブル削除

外部キーもあわせて

begin try
while(exists(select 1 from information_schema.table_constraints where constraint_type='foreign key'))
begin
	declare @sql nvarchar(2000)
	select top 1 @sql=('alter table ' + table_schema + '.[' + table_name
	+ '] drop constraint [' + constraint_name + ']')
	from information_schema.table_constraints
	where constraint_type = 'foreign key'
	exec (@sql)
end

while(exists(select 1 from sysobjects where xtype='u'))
begin
	select @sql=('drop table ' + name)
	from sysobjects 
	where xtype = 'u'
	exec (@sql)
end
end try
begin catch
    print error_message()
end catch;