xml地图|网站地图|网站标签 [设为首页] [加入收藏]
不能用于文件名的字符,标准事件模式
分类:编程

 (我在thinkphp的官网和QQ空间更新过)关于微信分享,即微信名片式的链接(如下图)图片 1,首先需要有经过验证的微信公众号,否则是玩不来的。
制作这种名片式的分享链接的步骤如下:
1、需要在公众号里绑定域名(一个公众号限定绑定三个域名,一天也只能修改三次),开通开发者模式,把里面的AppId和AppSecret记录下来,后面会用到;
2、下载腾讯官方的API文件(Demo包有4个文件,不过我们需要的是其中的3个php文件:jssdk.php、jsapi_ticket.php),这三个文件是怎样的,自己去查腾讯微信的API文档吧。别忘了在jssdk.php中添加命名空间:
namespace HomeController;

在 Windows 有一些字符是不能作为文件名,尝试重命名一个文件,输入/ 就可以看到windows 提示的不能作为文件名的字符

.NET框架为事件定义了一个标准模式,它的目的是保持框架和用户代码之间的一致性。

use ThinkController;
否则会出现找不到JSSDK类的情况;
3、接下来是非常粗糙的写法,基于目前对命名空间的使用和对thinkphp的公共函数用法以及类的继承和构造函数的使用不熟悉的前提,我把所有的关联代码都写在了同一个控制器文件中,什么都不用说,直接上代码:

图片 2

标准事件的模式核心是SystemEventArgs——预定义的没有成员的框架类(不同于静态Empty属性)

<?php

那么具体是包括哪些符号不能作为文件名?

EventArgs表示包含事件数据的类的基类,并提供用于不包含事件数据的事件的值。用于为事件传递信息的基类。

namespace HomeController;

  • Tilde (~)
  • Number sign (#)
  • Percent (%)
  • Ampersand (&)
  • Asterisk (*)
  • Braces ({ })
  • Backslash ()
  • Colon (:)
  • Angle brackets (< >)
  • Question mark (?)
  • Slash (/)
  • Plus sign (+)
  • Pipe (|)
  • Quotation mark (")

在下面例子中,我们定义EventArgs的子类,用于事件PriceChanged被引发时,传递新旧Price值:

use ThinkController;

上面这些字符不能用来文件名和文件夹名

    public class PriceChangedEventArgs : EventArgs
    {
        public readonly decimal LastPrice;
        public readonly decimal NewPrice;

        public PriceChangedEventArgs(decimal lastPrice, decimal newPrice)
        {
            LastPrice=lastPrice;
            NewPrice= newPrice;
        }
    }

class IndexController extends Controller {

而且在 windows 的要求,文件是需要有文件名的,虽然你也可以创建.file这样的文件,但是用户是难以自己输入这样的文件名。

考虑到复用性,EventArgs子类根据它包含的内容命名(而非根据将被使用的事件命名)。

    public function index(){
                /*******************************************下面是微信分享的代码***********************************************/
 // 因为不熟悉命名空间的使用,我直接把微信的API文件放在和这个控制器文件同一级的Controller目录下
                include('jssdk.php');         

之外还有一些文件名是保留,不能创建这样的文件名

选择或定义事件的委托,需遵循三条原则:

$jssdk = new JSSDK("wxf352c30e8350b48a","28e56c1a1ea8aefdfd2e700853bef8c9");

CON, PRN, AUX, CLOCK$, NUL
COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
LPT0, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9.
  • 委托必须以void作为返回值
  • 委托必须接受两个参数:第一个是object类,第二个是EventArgs的子类。
  • 委托的名称必须以EventHandler结尾

$wxconfig = array();

尝试新建一个文本,然后把他文件名命名为上面的任意一个,基本windows会说不能把文件命名

 

$wxconfig = $jssdk ->GetSignPackage();

那么是不是把这些字符串拿出来判断?实际上微软已经做了这个了,因为在不同的系统,可能之后会添加新的字符串,所以最好不要自己写。

完整例子:

 

可以使用微软给的函数System.IO.Path.GetInvalidFileNameChars ,下面的代码可以直接使用

class Test 
        public static void Main()
        {
            InitializeComponent();
            Stock stock = new Stock("THPW");
            stock.Price = 27.10M;
            //注册PriceChanged事件
            stock.PriceChanged += stock_PriceChanged;
            stock.Price = 31.59M;
        }

        static void stock_PriceChanged(object sender, PriceChangedEventArgs e)
        {
            if ((e.NewPrice - e.LastPrice) / e.LastPrice > 0.1M)
            {
                Console.WriteLine("Alert,10% stock increase!");
            }
        }
    }

    public class Stock
    {
        string symbol;
        decimal price;

        public Stock(string symbol)
        {
            this.symbol = symbol;
        }

        //定义委托事件
        public event EventHandler<PriceChangedEventArgs> PriceChanged;


        protected virtual void OnPriceChanged(PriceChangedEventArgs e)
        {
            if (PriceChanged != null) PriceChanged(this, e);
        }

        public decimal Price
        {
            get { return price; }
            set
            {
                if (price == value) return;

            price = value;

          OnPriceChanged(new PriceChangedEventArgs(price, value));

            }
        }
    }

    public class PriceChangedEventArgs : EventArgs
    {
        public readonly decimal LastPrice;
        public readonly decimal NewPrice;

        public PriceChangedEventArgs(decimal lastPrice, decimal newPrice)
        {
            LastPrice=lastPrice;
            NewPrice= newPrice;
        }
    }    

$this->assign('wxconfig',$wxconfig);

        public static string MakeValidFileName(string text, string replacement = "_")
        {
            StringBuilder str=new StringBuilder();
            var invalidFileNameChars = System.IO.Path.GetInvalidFileNameChars();
            foreach (var c in text)
            {
                if (invalidFileNameChars.Contains(c))
                {
                    str.Append(replacement??"");
                }
                else
                {
                    str.Append(c);
                }
            }

            return str.ToString();
        }

 

               /************************************************************************************************************************/

如果确实需要显示文件名,请使用下面代码

如果事件不传递额外的信息,可以使用预定义的非泛化委托EventHandler。如下所示:

if(empty($_POST)){

public static string GetSafeFilename(string arbitraryString)
{
    var invalidChars = System.IO.Path.GetInvalidFileNameChars();
    var replaceIndex = arbitraryString.IndexOfAny(invalidChars, 0);
    if (replaceIndex == -1) return arbitraryString;

    var r = new StringBuilder();
    var i = 0;

    do
    {
        r.Append(arbitraryString, i, replaceIndex - i);

        switch (arbitraryString[replaceIndex])
        {
            case '"':
                r.Append("''");
                break;
            case '<':
                r.Append('u02c2'); // '˂' (modifier letter left arrowhead)
                break;
            case '>':
                r.Append('u02c3'); // '˃' (modifier letter right arrowhead)
                break;
            case '|':
                r.Append('u2223'); // '∣' (divides)
                break;
            case ':':
                r.Append('-');
                break;
            case '*':
                r.Append('u2217'); // '∗' (asterisk operator)
                break;
            case '\':
            case '/':
                r.Append('u2044'); // '⁄' (fraction slash)
                break;
            case '':
            case 'f':
            case '?':
                break;
            case 't':
            case 'n':
            case 'r':
            case 'v':
                r.Append(' ');
                break;
            default:
                r.Append('_');
                break;
        }

        i = replaceIndex + 1;
        replaceIndex = arbitraryString.IndexOfAny(invalidChars, i);
    } while (replaceIndex != -1);

    r.Append(arbitraryString, i, arbitraryString.Length - i);

    return r.ToString();
}
    class Test
    {
        public static void Main()
        {
            InitializeComponent();
            Stock stock = new Stock();
            stock.Price = 27.10M;
            //注册PriceChanged事件
            stock.PriceChanged += stock_PriceChanged;
            stock.Price = 31.59M;
        }

        static void stock_PriceChanged(object sender, EventArgs e)
        {
           Console.WriteLine("价格变换了!");
        }
    }

    public class Stock
    {
        decimal price;

        public event EventHandler PriceChanged;

        protected virtual void OnPriceChanged(EventArgs e)
        {
            if (PriceChanged != null) PriceChanged(this, e);
        }

        public decimal Price
        {
            get { return price; }
            set
            {
                if (price == value) return;
                price = value;

                //OnPriceChanged(new EventArgs());

                OnPriceChanged(EventArgs.Empty);
            }
        }
    }

//echo "wrong";

上面的代码是jnm2 大神写的

 

$this->display();

参见:Information about the characters that you cannot use in site names, folder names, and file names in SharePoint

注意:

}else{

c# - How to make a valid Windows filename from an arbitrary string

上面例子中事件除了传递已发生信息,没有传递其他信息。

$submit=M("User");

我搭建了自己的博客 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

你可以使用 OnPriceChanged(new EventArgs()) 来完成事件的传递。

if (!$submit->autoCheckToken($_POST)){

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

为了避免对EventArgs不必要的初始化,建议使用EventArgs.Empty属性。使用这样一个“空的”静态引用的对象,避免多余地去创建一个新对象。

         // 令牌验证错误

图片 3
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

 

         //return false;

微软的大部分控件所抛出的事件都有两个参数,第一个是 object 类型的,第二个是 EventArgs 类型的。

         //echo "表单信息重复提交了";

图片 4

         $this->display();

你从EventArgs  e那里得不到任何此次事件相关需要传递的信息,真正传递的信息都在sender中。

 

         }else{

         $get["username"]=$_POST["name"];

            $get["telphone"]=$_POST["mobile"];

            $submit->add($get);

             //$name=md5($get["username"]);//字符加密

本文由澳门新葡亰手机版发布于编程,转载请注明出处:不能用于文件名的字符,标准事件模式

上一篇:python利用heapq实现小顶堆,线程基础 下一篇:没有了
猜你喜欢
热门排行
精彩图文